作者cole945 (躂躂..)
看板C_Sharp
标题Re: [问题] Callback 函式 (C# 呼叫 C++ dll) (用 …
时间Wed Sep 16 23:17:41 2009
→ percyy:嗯...什麽意思? @@"
如果这程式有问题的话, 应该在runtime会有exception呀?
DllImport 不到进入点, 应该会有找不到进入点的exception,
calling converntion或参数大小不到, 应该会告诉你 stack 烂掉 的excetion
callback function pointer有误, C/C++端呼叫时说不定会直接当掉..
或是 delegate 被GC回收了, 在debug环境下, 应该也会有exception
如果你什麽 exception都没收到,
要不是被你自己catch起来和谐掉了, 就是C/C++那边根本没有呼叫该callback
推 cplusplus:基本上 unmanaged C++ 不能直接call C#的method...
这确定可以呼叫 @.@
举个例子, 用 CreateThread() Windows API 来 create thraed,
而非使用 .NET 的 Thread Class
--
/*
* 这理是 p/invoke 相关的宣告
*/
delegate Int32 ThreadStartDelegate(IntPtr arg);
[DllImport("kernel32.dll")]
static extern IntPtr CreateThread(
IntPtr SecurityAttributes,
uint StackSize,
ThreadStartDelegate StartFunction,
IntPtr ThreadParameter, uint CreationFlags, out uint ThreadId);
/*
* 这里是使用该 p/invoke 的 code
*/
// CreateThread 在 .NET 的 callback
Int32 MyThread(IntPtr arg)
{
Console.WriteLine("Hello World");
}
// 呼叫 CreateThread
int tid;
IntPtr h;
ThreadStartDelegate td = new ThreadStartDelegate(MyThread);
h = CreateThread(IntPtr.Zero, 0, td, IntPtr.Zero, 0, out tid);
// 这里应该还要放个 WaitForSingleObject 等 Thread 结束....
GC.KeepAlive(td);
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 123.204.66.43
1F:→ percyy:无任何exception 我也没处理 倾向於callback函式没被执行到 09/16 23:32
2F:推 percyy:BTW, 我的平台是 Vista 64 Enterprise、Visual Studio 2008 09/16 23:35
3F:推 percyy:DLL的函式的回传值也正常 但就是没有callbak函式 09/16 23:41
4F:→ cole945:所以你的环境是64bit? 试试看在project设定中的Built-> 09/16 23:41
5F:→ cole945:platform target设成x86呢? 09/16 23:42
6F:推 percyy:我已经设了~ 有设才能 import 32-bit 的 DLL 09/17 00:44
7F:推 percyy:为什麽CreatThread第三个参数是丢null而不是td呢? 09/17 00:51
8F:→ percyy:(不好意思 我对 Windows API 不是很了解 ^^") 09/17 00:52
9F:→ cole945:因为我写错了...是丢td XD 09/17 01:03
※ 编辑: cole945 来自: 123.204.66.43 (09/17 01:03)
10F:→ cole945:感谢提醒, 我大E修正了~ 09/17 01:03
11F:推 percyy:所以照理说 透过delegate C/C++可以回呼C# 结果我的只肯 09/17 15:45
12F:→ percyy:吃long 变得不知该怎麽办 问问券商能否提供里面的资讯 09/17 15:45
13F:→ cole945:应该不会是long的问题@@ 因为delegate本来就会被marsah成 09/17 16:41
14F:→ cole945:function pointer, 而在.NET, pointer的size视平台而异, 09/17 16:41
15F:→ cole945:在x86-32, 其实也就是32bit, 与你在C/C++的long是一样的.. 09/17 16:41
16F:→ cole945:若有问题的话,应该会有runtime错误. 若都没出现, 应该比较 09/17 16:43
17F:→ cole945:像根本没呼叫到吧@@" 09/17 16:43
18F:推 cplusplus:原来直接传delegate? @@ 我找不到把delegate转成long的 09/29 14:25
19F:→ cplusplus:方法 @@ 所以原PO的方式不能搞 不过的确可以回乎m(_ _)m 09/29 14:27
20F:推 percyy:所以说 就算 delegate 转成 IntPtr 也不能相容於 long 吗? 10/01 08:52
21F:推 cplusplus:楼上,我本来以为delegate会内含一个IntPtr的member 10/03 01:41
22F:→ cplusplus:结果找了一找,没有...@@ 不像winform里面有handle... 10/03 01:42
23F:→ cplusplus:然後也找不到转换的方法 所以我当初觉得没有 10/03 01:42