-1

我实际上正在学习 C#/WPF,并且我用 C++ 编写了一个库。而且我有一个函数,它有一个LPSTR类型的输出参数,测试在 C++ 中运行良好,我实际上得到了我想要的正确大小的正确值。但是在导入 dll 并将格式设置为 unicode/ansi 之后在 C# 中,我的值要么是空的,要么是错误的值。

C++ 项目在 myfunction.dll win32 中构建。

C++ 导出

/*
* getting the right value in outString 
* c++ test
* 
*/

API_DLLEXPORT long GetSomeString (LPSTR outString ,long * outNbChar);
for (long iChar = 0; iChar < *outNbofchar; ++iChar)
{
    outsLibClass[iChar] = (char)finder.GetFileName()[iChar];
}
outsLibClass[*outNbofchar] = '\0';
break; 

C# 导入

[DllImport("myfunction.dll",  CharSet = CharSet.Unicode)]
public static extern Int32 GetSomeString (StringBuilder outString, ref Int32 outNbChar);

StringBuilder out = new StringBuilder(256) ;
Int32 nbchar = new Int32() ;

int result = GetSomeString (out, ref nbchar ) ;

Console.WriteLine(out.ToString());

// I get the right nbchar

但我没有得到正确的输出结果:

㠴0휐ࠦ휠ࠦ鏺瓑휬ࠦ찞瑻쳁촀

当然,我也尝试将其设置CharSetAnsi但结果为空。

因此,如果有人可以帮助我,那将是非常高兴的。

4

1 回答 1

-1

感谢评论中的@john 链接,我解决了它:我正在制作副本,但实际上并没有引用 outString 的地址。


// Replace LPSTR by LPSTR 
API_DLLEXPORT long GetSomeString (LPSTR * outString ,long * outNbChar);

并在 C# 中

[DllImport("myfunction.dll",  CharSet = CharSet.Unicode)]
public static extern Int32 GetSomeString ([MarshalAs(UnmanagedType.LPStr)] ref string outString,
                                          ref Int64 outNbChar);
于 2020-08-05T08:51:00.267 回答