从C#调用DLL中的C ++代码以获取字符串

时间:2016-09-26 10:29:32

标签: c# c++ dll

我正在使用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);

1 个答案:

答案 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语句中定义入口点