我目前正在用C#开发一个Excel in,我正在使用一个带有C++库的互操作。这两个都是我开发的。C++库不是一个COM组件,而仅仅是一个导出某些函数的动态链接库。
我有一个C#函数,我想将一个数字和两个字符串传递给C++函数,C++函数返回一个字符串。首先,我尝试直接返回一个字符串,所以原型看起来像这样
//C#
[return: MarshalAs(UnmanagedType.LPStr)]
private static extern string Function([MarshalAs(UnmanagedType.I4)] int number,
[MarshalAs(UnmanagedType.LPStr)]string str1,
[MarshalAs(UnmanagedType.LPStr)] string str2);
//C++
extern "C" __declspec(dllexport) string Function(int, char*, char*);(顺便说一句,我已经在C#中将这个函数的调用约定设置为Cdecl)
然后,当我调用C#版本,并进入C++ (调试时)时,我发现参数发生了移位,因此整数是指向第一个字符串的指针的值,第一个字符串是第二个字符串,第二个字符串指向其他地方。我还检查了内存,发现参数不是根据_cdecl约定传递的,整数是最后一个推入堆栈的(这没问题),但两个字符串的位置交换了。编译器还添加了许多其他信息,所以我不想深入讨论这个。
但是,后来我将返回字符串更改为参数,原型如下所示
//C#
private static extern void Function([MarshalAs(UnmanagedType.I4)]int number,
[MarshalAs(UnmanagedType.LPStr)] string str1,
[MarshalAs(UnmanagedType.LPStr)] string str2,
[MarshalAs(UnmanagedType.LPStr), Out] StringBuilder returnStr);
//C++
extern "C" __declspec(dllexport) void Function(int, char*, char*, string&);现在参数被正确地传递了。
所以我的第一个问题是,这是怎么发生的?
我的第二个问题是,即使使用第二种方法,我也不能正确运行程序,程序在从C++函数返回时崩溃(实际上在C++函数中,唯一要做的就是调用类的另一个成员函数,所以该函数就像成员函数的包装器,当返回成员函数时程序崩溃。因为warpper函数只调用成员函数,所以我不知道问题出在哪里)。
有谁知道怎么做吗?所以这个函数的要点是接受一个数字和两个字符串,然后返回另一个字符串。
在进阶时谢谢。
发布于 2012-08-24 16:20:18
look at this article about the usage of stringbuilder in unmanaged code
尝试如下所示:
//C#
public string Function(int number, string str1, string str2)
{
StringBuilder sbStr1 = new StringBuilder(str1);
StringBuilder sbStr2 = new StringBuilder(str2);
StringBuilder sbReturnStr = new StringBuilder(1024);
Function(number, sbStr1 , sbStr2 , sbReturnStr , sbReturnStr.Capacity);
return sbReturnStr.ToString();
}
//C# p/invoke
private static extern void Function(int number, StringBuilder str1, StringBuilder str2, StringBuilder returnStrBuffer, int size);
//C++
extern "C" __declspec (dllexport) void __stdcall Function(int number, const char* str1, const char* str2, char* returnStrBuffer, int size)
{
//fill the returnStrBuffer
strncpy(returnStrBuffer, "blablalb", size); //example!!
}https://stackoverflow.com/questions/12105420
复制相似问题