我正在使用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.Net软件中使用多年,并且我在完全正常工作的环境中进行测试/开发。
为了完整起见,VB代码将其声明为 (ByVal sc As String) 并使用
调用该函数Dim tempCode As String
tempCode = "xxxx-yyyyy-zzz";
GetCode(tempCode);
答案 0 :(得分:0)
与c#一起使用时,我通常使用C名称导出我的c ++函数。 由于您使用了c ++名称,我建议尝试按序号而不是函数名进行dllimport。
之类的东西$(".rowid").each(function() {
var a = $(this).find(".user input").val();
alert(a);
});
我也注意到你的函数名称在dllimport中不匹配。 在你的C ++中,你称之为" GetCode"但是在dllimport你称之为" UTB_GetCode" 如果需要,可以更改名称,但是需要在dll import语句中定义入口点