C#调用VC的DLL CallBack函数问题,CallBack函数返回数据有问题

IMarksman 2007-05-21 03:44:08
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",请问原因是什么?
...全文
393 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
加蓝007 2010-11-12
  • 打赏
  • 举报
回复

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);
}
}
IMarksman 2007-05-21
  • 打赏
  • 举报
回复
仍然采用这种方式。
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的属性就不起作用。
IMarksman 2007-05-21
  • 打赏
  • 举报
回复
怪异,改为
t(SysAllocString((BSTR)"abcdef"));
就可以了,谁能解释一下原因,并且这种方式是否会有内存泄漏?
IMarksman 2007-05-21
  • 打赏
  • 举报
回复
我已经用了Unicode编译,但错误依旧。
绝缘 2007-05-21
  • 打赏
  • 举报
回复
终于在C#版遇到能解决的问题了。呵呵。
C#的string是2字节编码的(具体是BSTR还是Unicode就不知了),所以在你的VC中要用Unicode编译,或return t(_L("abcdef"));
真相重于对错 2007-05-21
  • 打赏
  • 举报
回复
注意函数参数定一个字符串编码c++要与c#一致

111,097

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧