如何匹配C++;LPSTR到C# 我实际上是在学习C/WPF,我用C++编写了一个库。我有一个函数,它的输出参数在 LpSTR< /COD>类型中,测试在C++中工作得很好,实际上我得到了正确的大小所需的正确值。但在C#中,在导入dll并将格式设置为unicode/ansi后,要么是空值,要么是坏值

如何匹配C++;LPSTR到C# 我实际上是在学习C/WPF,我用C++编写了一个库。我有一个函数,它的输出参数在 LpSTR< /COD>类型中,测试在C++中工作得很好,实际上我得到了正确的大小所需的正确值。但在C#中,在导入dll并将格式设置为unicode/ansi后,要么是空值,要么是坏值,c#,c++,string,dll,lpstr,C#,C++,String,Dll,Lpstr,在myfunction.dll win32中构建C++项目 C++导出 /* *在outString中获得正确的值 *C++测试 * */ API_DLLEXPORT long GetSomeString(LPSTR outString,long*outNbChar); for(长iChar=0;iChar

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

C++导出
/*
*在outString中获得正确的值
*C++测试
* 
*/
API_DLLEXPORT long GetSomeString(LPSTR outString,long*outNbChar);
for(长iChar=0;iChar<*outNbofchar;++iChar)
{
outsLibClass[iChar]=(char)finder.GetFileName()[iChar];
}
outsLibClass[*outNbofchar]='\0';
打破
C#进口
[DllImport(“myfunction.dll”,CharSet=CharSet.Unicode)]
公共静态外部程序Int32 GetSomeString(StringBuilder outString,参考Int32 outNbChar);
StringBuilder out=新的StringBuilder(256);
Int32 nbchar=新的Int32();
int result=GetSomeString(out,ref nbchar);
Console.WriteLine(out.ToString());
//我得到了正确的答案
但我没有得到正确的突出结果:

㠴0휐ࠦ휠ࠦ鏺瓑휬ࠦ찞瑻쳁촀
当然,我也尝试将
CharSet
设置为
Ansi
,但结果是空的


因此,如果有人能帮助我,那将是一件非常愉快的事。

Thx给@john link在评论中,我决定: 我只是复印了一份,实际上并没有提到outString的地址


//用LPSTR替换LPSTR
API_DLLEXPORT long GetSomeString(LPSTR*outString,long*outNbChar);
在c中#

[DllImport(“myfunction.dll”,CharSet=CharSet.Unicode)]
公共静态外部程序Int32 GetSomeString([Marshallas(UnmanagedType.LPStr)]ref string outString,
参考Int64 outNbChar);

我很确定你在C++中也没有得到正确的结果。请显示
GetSomeString
。对于(long iChar=0;iChar<*outNbofchar;++iChar){outlibclass[iChar]=(char)finder.GetFileName()[iChar];}outlibclass[*outNbofchar]='\0';中断
long
在64位平台上是64位的,但您已将其映射到托管端的
Int32
。另外,请展示@GSerg提到的
GetSomeString
的完整实现。注释中的代码片段不够(例如,
finder
?)@TainToTain
长度为64位,这是错误的,原因很多。如果在调用端(正确)分配了内存,则必须使用
LPSTR
,而不是
LPSTR*
。您不应该仅为了立即将Unicode重写为Ansi而声明Unicode,也不应该为32位
长的
传递
Int64
。如果这件事发生在你身上,这是一个巧合。@GSerg我同意这有点奇怪,但我遵循了这件事和它的工作。奇怪和错误是有区别的。您应该有
API\u DLLEXPORT long GetSomeString(LPSTR outString,long*outNbChar)
[DllImport(“myfunction.dll”,CharSet=CharSet.Ansi)]公共静态外部int-GetSomeString(StringBuilder-outString,ref-int-outNbChar),您应该为第二个参数传递“字符串生成器的当前容量减去1”。在复制中使用的C++循环也存在各种各样的问题,但我目前还没有触及(“负1”是这些问题的表现之一)。