2016-09-26 41 views
0

我正在使用C#中的C++ DLL。除了一个接受输入字符串指针并填充数据的函数之外,一切正常。我有DLL的源代码,以及上述功能的代码是这样的:在C#中调用DLL中的C++代码以获取字符串

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作为字符串) 并调用

Dim tempCode As String 
tempCode = "xxxx-yyyyy-zzz"; 
GetCode(tempCode); 

回答

0

与C#使用功能,我通常会导出我的C++函数与C名字。 既然您使用了C++名称,我建议您尝试使用序号而不是函数名进行dllimport。 像

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

香港专业教育学院还注意到,您的函数名在dllimport的不匹配。 在你的C++,你把它称为“引用代码”,但在dllimport的你已称之为“UTB_GetCode” 您可以更改确定的名字,如果你想,但你需要在你的DLL import语句

+0

定义入口点呀,UTB部分在重写这里的内容时出错 – motoDrizzt