Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在c#中通过pinvoke编组wchar#t不会将其值返回给StringBuilder 首先,我想说的是,我对C++和pNoCKE的了解已经很沮丧了。 我目前正在研究一个C++包装器和pjunk,它没有返回我需要的信息。_C#_C++_Pinvoke_Marshalling_Wchar T - Fatal编程技术网

在c#中通过pinvoke编组wchar#t不会将其值返回给StringBuilder 首先,我想说的是,我对C++和pNoCKE的了解已经很沮丧了。 我目前正在研究一个C++包装器和pjunk,它没有返回我需要的信息。

在c#中通过pinvoke编组wchar#t不会将其值返回给StringBuilder 首先,我想说的是,我对C++和pNoCKE的了解已经很沮丧了。 我目前正在研究一个C++包装器和pjunk,它没有返回我需要的信息。,c#,c++,pinvoke,marshalling,wchar-t,C#,C++,Pinvoke,Marshalling,Wchar T,以下是我正在做的事情: 我有一个C++的签名方法: DllExport int LookupFamilyName(__in PCWSTR familyName,__out_opt wchar_t* result, int lengthIn) 内部代码: UINT32 count = 0; UINT32 length = 0; LONG rc = GetPackagesByPackageFamily(familyName, &count, NULL, &length, NULL

以下是我正在做的事情: 我有一个C++的签名方法:

DllExport int LookupFamilyName(__in PCWSTR familyName,__out_opt wchar_t* result, int lengthIn)
内部代码:

UINT32 count = 0;
UINT32 length = 0;

LONG rc = GetPackagesByPackageFamily(familyName, &count, NULL, &length, NULL);
if (rc == ERROR_SUCCESS)
{
    return int(rc);
}
else if (rc != ERROR_INSUFFICIENT_BUFFER)  //122
{
    return int(rc);
}

PWSTR *fullNames = (PWSTR *) malloc(count * sizeof(*fullNames));

if (fullNames == NULL)
{
    return 700010; //faile to allocate memeory
}

PWSTR buffer = (PWSTR) malloc(length * sizeof(WCHAR));
if (buffer == NULL)
{
    return 700011; //faile to allocate memeory
}

rc = GetPackagesByPackageFamily(familyName, &count, fullNames, &length, buffer);


if (rc != ERROR_SUCCESS)
{
    return int(rc);
}
else
{
    result = new wchar_t[lengthIn];
    for (UINT32 i = 0; i < count; ++i)
    {
        wcscpy_s(result,lengthIn,fullNames[i]);
    }
}
free(buffer);
free(fullNames);
然后我在C#用下面的话来称呼它:

string packagename = "Microsoft.MicrosoftEdge_8wekyb3d8bbwe";
StringBuilder showmethemoney = new StringBuilder(64);
int x = LookupFamilyName(packagename, ref showmethemoney,showmethemoney.Capacity);

我正在为W查尔特特传递一个StrugBu建器,这个值在我们到达LoopUpHythyNyMead方法的结尾时就被填充了,但是当我们回到C代码时,StringBuilder没有WCARGYT**在C++代码中的值。


对于那些比我了解更多的人,我需要做些什么来确保wchar\u t*结果中的值被传递回StringBuilder?

您将第二个参数声明为wchar\u t**。删除
ref
。我从pinvoke调用和c代码中删除了ref,但返回时StringBuilder仍然为空。下一个错误是
result=new wchar\t[lengthIn],删除那一行。汉斯,就是这样。这两个变化带来了所有的不同!现在工作得很有魅力。
string packagename = "Microsoft.MicrosoftEdge_8wekyb3d8bbwe";
StringBuilder showmethemoney = new StringBuilder(64);
int x = LookupFamilyName(packagename, ref showmethemoney,showmethemoney.Capacity);