C#调用VC的DLL CallBack函数问题,CallBack函数返回数据有问题
VC实现一个DLL,其中一个导出方法接受一个函数指针,实现Callbak功能,下面是DLL的导出函数。
typedef void (WINAPI *fnCallBack)(LPCTSTR ptr);
extern "C" __declspec(dllexport) void ShowMsg(fnCallBack t)
{
return t(_T("abcdef"));
}
C#中采用delegate实现回调函数的定义,如下
public delegate void OnMsgDlg(string str);
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
OnMsgDlg omd = new OnMsgDlg(Form1.OnMsg);
ShowMsg(omd);
}
[DllImport("DllProject.dll")]
public static extern void ShowMsg(OnMsgDlg fnCallback);
public static void OnMsg(string str)
{
MessageBox.Show(str);
}
}
运行结果错误,本应现实"abcdef",结果只显示一个"a",请问原因是什么?
--------------------编程问答-------------------- 注意函数参数定一个字符串编码c++要与c#一致 --------------------编程问答-------------------- 终于在C#版遇到能解决的问题了。呵呵。
C#的string是2字节编码的(具体是BSTR还是Unicode就不知了),所以在你的VC中要用Unicode编译,或return t(_L("abcdef")); --------------------编程问答-------------------- 我已经用了Unicode编译,但错误依旧。 --------------------编程问答-------------------- 怪异,改为
t(SysAllocString((BSTR)"abcdef"));
就可以了,谁能解释一下原因,并且这种方式是否会有内存泄漏? --------------------编程问答-------------------- 仍然采用这种方式。
typedef void (WINAPI *fnCallBack)(LPCTSTR ptr);
extern "C" __declspec(dllexport) void ShowMsg(fnCallBack t)
{
return t(_T("abcdef"));
}
如果采用_MBCS编译,则无论dllimport的charset属性是什么,结果都正确。
如果采用_UNICODE,UNICODE编译,无论dllimport的charset属性是什么,结果都不正确。
好像callback的时候,charset的属性就不起作用。
--------------------编程问答--------------------
public delegate void OnMsgDlg([MarshalAs(UnmanagedType.LPTStr)] string str);
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
OnMsgDlg omd = new OnMsgDlg(Form1.OnMsg);
ShowMsg(omd);
}
[DllImport("DllProject.dll ")]
public static extern void ShowMsg(OnMsgDlg fnCallback);
public static void OnMsg([MarshalAs(UnmanagedType.LPTStr)] string str)
{
MessageBox.Show(str);
}
}
补充:.NET技术 , C#