需要在C++回调C#函数
核心代码如下(只是测试,发现不行)
C++部分:
typedef void (*ShowMsgCallBack)(string sMsg);
extern "C" _declspec(dllexport) bool RegCallBack(ShowMsgCallBack fHandlerFunc);
extern "C" _declspec(dllexport) bool Start(); ShowMsgCallBack g_ShowMsgCallBack = NULL;
bool RegCallBack(ShowMsgCallBack fHandlerFunc)
{
g_ShowMsgCallBack = fHandlerFunc;
return true;
} bool Start()
{
string sMsg("just for test");
if (g_ShowMsgCallBack != NULL)
{
g_ShowMsgCallBack(sMsg);
}
return true;
}C#部分
public delegate void ShowMessage(string sMsg);
[DllImport("TestDll.dll",SetLastError = true, CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
public static extern bool RegCallBack(ShowMessage fHandlerFunc); [DllImport("TestDll.dll", SetLastError = true, CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
public static extern bool Start(); public void ShowMsg(string sMsg)
{
MessageBox.Show(sMsg, this.Text, MessageBoxButtons.OK);
} private void button3_Click(object sender, EventArgs e)
{
ShowMessage tmpShowMsg = new ShowMessage(this.ShowMsg);
RegCallBack(tmpShowMsg); } private void button4_Click(object sender, EventArgs e)
{
Start();
}程序运行的时候,MessageBox弹出来了,但是“just for test”没有显示,然后程序就崩掉了。
提示调用约定不一致。我试了把C++工程的调用约定改为了_stdcall和__cdecl都不行。。是什么原因呢?
核心代码如下(只是测试,发现不行)
C++部分:
typedef void (*ShowMsgCallBack)(string sMsg);
extern "C" _declspec(dllexport) bool RegCallBack(ShowMsgCallBack fHandlerFunc);
extern "C" _declspec(dllexport) bool Start(); ShowMsgCallBack g_ShowMsgCallBack = NULL;
bool RegCallBack(ShowMsgCallBack fHandlerFunc)
{
g_ShowMsgCallBack = fHandlerFunc;
return true;
} bool Start()
{
string sMsg("just for test");
if (g_ShowMsgCallBack != NULL)
{
g_ShowMsgCallBack(sMsg);
}
return true;
}C#部分
public delegate void ShowMessage(string sMsg);
[DllImport("TestDll.dll",SetLastError = true, CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
public static extern bool RegCallBack(ShowMessage fHandlerFunc); [DllImport("TestDll.dll", SetLastError = true, CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
public static extern bool Start(); public void ShowMsg(string sMsg)
{
MessageBox.Show(sMsg, this.Text, MessageBoxButtons.OK);
} private void button3_Click(object sender, EventArgs e)
{
ShowMessage tmpShowMsg = new ShowMessage(this.ShowMsg);
RegCallBack(tmpShowMsg); } private void button4_Click(object sender, EventArgs e)
{
Start();
}程序运行的时候,MessageBox弹出来了,但是“just for test”没有显示,然后程序就崩掉了。
提示调用约定不一致。我试了把C++工程的调用约定改为了_stdcall和__cdecl都不行。。是什么原因呢?
解决方案 »
- c#之WebRequest..::.Create 方法 (Uri)
- (c# winform) panel里面动态生成radiobutton,如何动态给每个radio加事件
- 删除服务器图片问题
- C#读取xml在线等啊.高手来救一下~(50分)
- 我第一次用vs2005,但是出现了一个怪现象:没法新建webform 和.cs类文件
- 关于2005里面SerialPort控件用法的提问,会的帮忙看看
- datagrid几个关键问题,急急急........在线等
- 关于sp商
- 异步10秒后再做另一件事,UI受阻
- WINFORM自动定时备份数据
- C# windows应用程序 listview控件怎么操控?
- 如何选中dataset中具体的某一单元格
建议:回调函数中用LPCWSTR。