C#调用C++ 的DLL的相关问题

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.

4.调用MFC扩展库的时候,当出现调用的对话框没有弹出时,可能是因为将对话框的Style属性设置成了child.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值