从c#调用DLL中的c++代码来返回字符串
本文关键字:代码 返回 字符串 c++ 中的 调用 DLL | 更新日期: 2023-09-27 18:08:44
我正在使用c#中的c++ DLL。一切工作正常,除了一个函数,输入一个字符串指针,并填入数据。我有DLL的源代码,上面提到的函数代码是这样的:
int CDLL::GetCode(char *CodeN)
{
int year, cn, sn1;
year = m_dwCode >> 24;
year += 2000;
sn = (m_dwCode >> 8) & (0xFFFF);
sn1 = m_dwCode & (0xFF);
if (sn1 != 0) {
sprintf(CodeN, "%d-%d-%d", year, cn, sn1);
}
else {
sprintf(CodeN, "%d-%d", year, sn);
}
return 1;
}
函数本身是这样导出的:
_declspec(dllexport) int WINAPI GetCode(char *sn)
{
return ((CDLL*)AfxGetApp())->GetCode(sn);
};
我试过用许多不同的方式导入它,但似乎都不起作用;我总是得到垃圾而不是预期的代码。
这是我最后一次尝试导入:
[DllImport("CDLL.dll", CallingConvention = CallingConvention.Winapi)]
internal extern static int GetCode([param: MarshalAs(UnmanagedType.LPTStr), Out()] StringBuilder sn);
这是呼叫代码:
StringBuilder myCode = new StringBuilder("xxxx-yyyyy-zzz");
Wrapper.GetCode(myCode);
return myCode.ToString();
但是我总是在结束时将垃圾放入字符串中,并且字符串比我预期的长。
注意,在有人问它之前:DLL工作正常,已经在VB中使用多年了。我正在一个完全工作的环境中进行测试/开发。
为了完整起见,VB代码将其声明为(ByVal sc As String)并使用
调用函数Dim tempCode As String
tempCode = "xxxx-yyyyy-zzz";
GetCode(tempCode);
为了与c#一起使用,我通常使用c名称导出c++函数。由于您使用了c++名称,我建议尝试通过序数而不是函数名称来导入。比如
[DllImport("CDLL.dll", EntryPoint="#25")]
我还注意到你的函数名在你的limport中不匹配。在c++中你叫它"GetCode"但在dll中你叫它"UTB_GetCode"如果你想的话,你可以更改名称,但是你需要在你的dll导入语句