C#调用C++ 的DLL的相关问题
1.C#调用C++的函数参数只能用基础类型
我记得在哪篇文章中读过,找不到了,验证了一番,基本是这样的。C++的函数参数只能用C++的基础数据类型。可以用指针、数组、引用。
基础类型:整型、浮点型、字符型、布尔型、空类型。
2.当C#传递给C++的字符串发生变化时,很可能是因为DllImport的CharSet属性引起的
例如:
C#中的代码为
[DllImport("SendData.dll", EntryPoint = "BtnSend", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern bool BtnSend(string csProjPath);
private void btn_DataSend_Click(object sender, EventArgs e)
{
string _JsonFileName="gdehigri"
BtnSend(_JsonFileName);
}
C++中的代码为
extern "C" __declspec(dllexport) bool __stdcall BtnSend(char* _csProjPath)
{
CString cs_TmpStr=_csProjPath;
return TRUE;
}
运行的时候,有可能会出现C++代码中的变量cs_TmpStr的值只等于“g”而不等于“gdehigri”。而_csProjPath指针往后的值在每个字符中间都有一个0(结束符)。引起这个问题的原因,多半是因为C++库项目->属性->常规->字符集中设置了“使用多字节字符集”。
解决这个问题的办法就是将DllImport的CharSet属性设置成CharSet.Ansi。
3.C#应用程序调用各种MFC库时可能遇到的问题
1)调用静态MFC库时,基本可以直接调用,不会出现问题
2)调用共享MFC库时,可能会出现不弹MFC对话框或者出现下面的错误
可以使用语句AFX_MANAGE_STATE(AfxGetStaticModuleState())放在外调函数最开始的位置解决该问题。代码如下
extern "C" __declspec(dllexport) int __stdcall BtnSend(int _iIsCreatSendDlg)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CDlgTestShare dlgTestShare;
if (dlgTestShare.DoModal())
{
return _iIsCreatSendDlg + 1;
}
else
{
return _iIsCreatSendDlg;
}
}
3)调用扩展MFC库时,当出现\vc7libs\ship\atlmfc\include\afxwin1.inl Line:24的错误时,可以使用语句AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0);放在程序使用MFC类之前即可。代码如下
extern "C" __declspec(dllexport) int __stdcall BtnSend(int _iIsCreatSendDlg)
{
AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0);
CDlgTestExpand dlgTestExpand;
if (dlgTestExpand.DoModal())
{
return _iIsCreatSendDlg + 1;
}
else
{
return _iIsCreatSendDlg;
}
}
链接: link.