c#调用c++的DLL,接口函数参数有函数指针,在线等解决办法 20
c++接口函数原型为:C/C++codevoidConnecter(intServerPort,void(*pF)(char*buf,char*ClientIP,intC...
c++接口函数原型为:
C/C++ code
void Connecter(int ServerPort,void(* pF)(char* buf,char* ClientIP,int ClientPort));
我这样写的c#调用:
C# code
public partial class Default
{
[DllImport("MyServerDLL.dll",
EntryPoint = "Connecter",
CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern void Connecter(int ServerPort, IntPtr P);
public delegate void FunctionDelegate(IntPtr buf, IntPtr ClientIP, int ClientPort);
void Callback(IntPtr buf, IntPtr ClientIP, int ClientPort)
{
showLb.Text = buf.ToString();
}
。。。
protected void serverBtn_Click(object sender, EventArgs e)
{
//IntPtr intPtr = new IntPtr();----------------如果这样写,异常:值不能为空。参数名: ptr
//int nSizeOfCallback = Marshal.AllocHGlobal(Callback);-------------如果这样写,由于Callback是函数,所以不能Marshal.AllocHGlobal(Callback);
//IntPtr intPtr = Marshal.AllocHGlobal(nSizeOfCallback);-----我将nSizeOfCallback改为64注释掉上一行,试验一下,提示:指定结构必须能直接复制到本机结构中,或是具有布局信息。
参数名: structure
Marshal.StructureToPtr(new FunctionDelegate(Callback).Target, intPtr, true);
Connecter(5000, intPtr);
}
}
我没用过c#,所以不太知道这种情况下怎么调c++的DLL。请高手帮我写下这段代码。谢了,在线等 展开
C/C++ code
void Connecter(int ServerPort,void(* pF)(char* buf,char* ClientIP,int ClientPort));
我这样写的c#调用:
C# code
public partial class Default
{
[DllImport("MyServerDLL.dll",
EntryPoint = "Connecter",
CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern void Connecter(int ServerPort, IntPtr P);
public delegate void FunctionDelegate(IntPtr buf, IntPtr ClientIP, int ClientPort);
void Callback(IntPtr buf, IntPtr ClientIP, int ClientPort)
{
showLb.Text = buf.ToString();
}
。。。
protected void serverBtn_Click(object sender, EventArgs e)
{
//IntPtr intPtr = new IntPtr();----------------如果这样写,异常:值不能为空。参数名: ptr
//int nSizeOfCallback = Marshal.AllocHGlobal(Callback);-------------如果这样写,由于Callback是函数,所以不能Marshal.AllocHGlobal(Callback);
//IntPtr intPtr = Marshal.AllocHGlobal(nSizeOfCallback);-----我将nSizeOfCallback改为64注释掉上一行,试验一下,提示:指定结构必须能直接复制到本机结构中,或是具有布局信息。
参数名: structure
Marshal.StructureToPtr(new FunctionDelegate(Callback).Target, intPtr, true);
Connecter(5000, intPtr);
}
}
我没用过c#,所以不太知道这种情况下怎么调c++的DLL。请高手帮我写下这段代码。谢了,在线等 展开
3个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询