从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#调用DLL中的c++代码来返回字符串

为了与c#一起使用,我通常使用c名称导出c++函数。由于您使用了c++名称,我建议尝试通过序数而不是函数名称来导入。比如

[DllImport("CDLL.dll", EntryPoint="#25")]

我还注意到你的函数名在你的limport中不匹配。在c++中你叫它"GetCode"但在dll中你叫它"UTB_GetCode"如果你想的话,你可以更改名称,但是你需要在你的dll导入语句

中定义入口点。