gpt4 book ai didi

.net - 是否可以在SAFEARRAY中编码(marshal)ref参数

转载 作者:行者123 更新时间:2023-12-04 04:41:55 25 4
gpt4 key购买 nike

这是我的C#服务器方法:

public void Exec(out int status, string output)
{
status = 3;
Console.WriteLine("Exec({0}, ...)", status);

output = string.Format("Hello from .NET {0}", DateTime.Now);
Console.WriteLine("Exec(..., {0})", output);
}

我的C++客户端正在设置并调用此方法。这可以正常工作,但是状态变量和输出变量似乎没有链接。好像它们是通过值而不是通过引用传递的。

这是我的客户代码:
InitCLR();

LONG index = 0;

LONG i1 = 12; // just some number for testing
BSTR s1 = SysAllocString(L"Hello world");

SAFEARRAY* args = NULL;
CHECK_HRESULT( SafeArrayAllocDescriptor(1, &args) );

args->cbElements = sizeof(VARIANT);
args->rgsabound[0].lLbound = 0;
args->rgsabound[0].cElements = 2;

CHECK_HRESULT( SafeArrayAllocData(args) );

// byref not working for in/out param
VARIANT arg1;
VariantInit(&arg1);
V_I4REF(&arg1) = &i1;
V_VT(&arg1) = VT_I4 | VT_BYREF;

// byref not working
VARIANT arg2;
VariantInit(&arg2);
V_BSTR(&arg2) = SysAllocString(L"Hello world");
V_VT(&arg2) = VT_BSTR;

index = 0;
CHECK_HRESULT( SafeArrayPutElement(args, &index, &arg1) );

index = 1;
CHECK_HRESULT( SafeArrayPutElement(args, &index, &arg2) );

int bindingFlags = mscorlib::BindingFlags_InvokeMethod |
mscorlib::BindingFlags_Instance |
mscorlib::BindingFlags_Public;

VARIANT retval;
VariantInit(&retval);

bstr_t methodName("Exec");
HRESULT hRes = Type->InvokeMember_3(
methodName,
static_cast<mscorlib::BindingFlags>(bindingFlags),
NULL, // binder *
Instance,
args,
&retval);

_tprintf(TEXT("Exec() == 0x%x\n"), hRes);

_tprintf(TEXT("i1=%d\n"), i1);

有人可以在设置SAFEARRAY参数方面提供帮助,以便将“ref”参数复制回去吗?

最佳答案

我可能不知道完整的答案,但是我在您的代码中发现了两点:

引用未正确传递字符串

C#中的字符串是不可变的引用对象。这意味着对它们的引用将被传递(按值),并且一旦创建了字符串,就无法对其进行修改。如果您修改字符串值,则实际上是创建一个新字符串并更改对该字符串的本地引用。

关于它有一个很好的解释here

因此,您需要将C#函数的定义更改为如下所示:

public void Exec(out int status, out string output)
{
...
}

您应该使用ref而不是

您似乎在 C#函数调用未初始化为函数本身之前初始化了参数值

因此,您应该使用ref而不是out关键字;
public void Exec(ref int status, ref string output)
{
...
}

关于.net - 是否可以在SAFEARRAY中编码(marshal)ref参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12443784/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com