Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.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++ C++;托管clr调用库don';在safearray参数中返回字符串_C++_Winapi_Interop_Clr - Fatal编程技术网

C++ C++;托管clr调用库don';在safearray参数中返回字符串

C++ C++;托管clr调用库don';在safearray参数中返回字符串,c++,winapi,interop,clr,C++,Winapi,Interop,Clr,我有一个CSharp库: using System; namespace MyNetLib { public class Myclass { public int MyFunc(string strin, ref string strout) { strout = "Input string is: " + strout; return strin.Length; } } }

我有一个CSharp库:

using System; namespace MyNetLib { public class Myclass { public int MyFunc(string strin, ref string strout) { strout = "Input string is: " + strout; return strin.Length; } } } 使用制度; 名称空间MyNetLib { 公共类Myclass { public int MyFunc(string strin,ref string strout) { strout=“输入字符串为:”+strout; 回纹长度; } } } 我运行下面的代码,但没有返回SafeArray参数中的输出字符串。由于没有错误迹象,有什么问题

#include <atlbase.h> #include <mscoree.h> #include <metahost.h> #pragma comment (lib, "mscoree.lib") #import <mscorlib.tlb> raw_interfaces_only high_property_prefixes ("_get", "_put", "_putref") rename ("ReportEvent", "StdReportEvent") rename ("_DSA", "_CLR_DSA") using namespace mscorlib; void main() { ICorRuntimeHost *pCorRuntimeHost = NULL; HRESULT hr = CorBindToRuntimeEx( L"v4.0.30319", L"srv", STARTUP_LOADER_OPTIMIZATION_SINGLE_DOMAIN | STARTUP_CONCURRENT_GC, CLSID_CorRuntimeHost, IID_PPV_ARGS( &pCorRuntimeHost ) ); pCorRuntimeHost->Start(); IUnknown *pUnkDomain = NULL; _AppDomain *pAppDomain = NULL; hr = pCorRuntimeHost-> GetDefaultDomain ((IUnknown **) &pUnkDomain); hr = pUnkDomain-> QueryInterface (__uuidof (_AppDomain), (void **) &pAppDomain); _Assembly *pAssembly = NULL; BSTR bstrAssemblyString = SysAllocString (L"MyNetLib"); hr = pAppDomain-> Load_2 (bstrAssemblyString, &pAssembly); SysFreeString (bstrAssemblyString); _Type *pType = NULL; BSTR typeString = SysAllocString (L"MyNetLib.Myclass"); VARIANT obj; hr = pAssembly-> GetType_2 (typeString, &pType); hr = pAssembly-> CreateInstance (typeString, &obj); SysFreeString (typeString); LONG index = 0; SAFEARRAY* safeArgs = NULL; SafeArrayAllocDescriptor(1, &safeArgs); safeArgs->cbElements = sizeof(VARIANT); safeArgs->rgsabound[0].lLbound = 0; safeArgs->rgsabound[0].cElements = 2; SafeArrayAllocData(safeArgs); VARIANT arg1; VariantInit(&arg1); V_BSTR(&arg1) = SysAllocString (L"String input."); V_VT(&arg1) = VT_BSTR; VARIANT arg2; BSTR pbstrOut = NULL; VariantInit(&arg2); V_BSTRREF(&arg2) = & pbstrOut; V_VT(&arg2) = VT_BSTR | VT_BYREF; VARIANT retVal; SafeArrayPutElement(safeArgs, &index, &arg1); index++; SafeArrayPutElement(safeArgs, &index, &arg2); BSTR methodString = SysAllocString (L"MyFunc"); hr = pType-> InvokeMember_3 (methodString, (BindingFlags) (BindingFlags_InvokeMethod | BindingFlags_Public | BindingFlags_Instance), NULL, obj, safeArgs, &retVal); } #包括 #包括 #包括 #pragma注释(lib,“mscoree.lib”) #导入原始接口\u仅高\u属性\u前缀(“\u get”、“\u put”、“\u putref”)重命名(“ReportEvent”、“StdReportEvent”)重命名(“\u DSA”、“\u CLR\u DSA”) 使用名称空间mscorlib; void main() { ICorRuntimeHost*pCorRuntimeHost=NULL; HRESULT hr=CorBindToRuntimeEx(L“v4.0.30319”,L“srv”,启动加载程序优化单域启动并发GC, CLSID_CorRuntimeHost、IID_PPV_ARGS(&pCorRuntimeHost)); pCorRuntimeHost->Start(); IUnknown*pUnkDomain=NULL; _AppDomain*pAppDomain=NULL; hr=pCorRuntimeHost->GetDefaultDomain((IUnknown**)和pUnkDomain); hr=pUnkDomain->QueryInterface(uuuIdof(uAppDomain),(void**)和pAppDomain); _Assembly*pAssembly=NULL; BSTR bstrAssemblyString=SysAllocString(L“MyNetLib”); hr=pappodomain->Load_2(bstrAssemblyString和pAssembly); SysFreeString(bstrAssemblyString); _Type*pType=NULL; BSTR typeString=SysAllocString(L“MyNetLib.Myclass”); 变异obj; hr=pAssembly->GetType_2(typeString和pType); hr=pAssembly->CreateInstance(typeString,&obj); SysFreeString(typeString); 长指数=0; SAFEARRAY*safeArgs=NULL; SafeArrayAllocDescriptor(1和safeArgs); safeArgs->cbElements=sizeof(变量); safeArgs->rgsabound[0]。lLbound=0; safeArgs->rgsabound[0]。cElements=2; SafeArrayAllocData(safeArgs); 变异体arg1; VariantInit(&arg1); V_BSTR(&arg1)=SysAllocString(L“字符串输入”); V_VT(&arg1)=VT_BSTR; 变异体arg2; BSTR pbstrOut=NULL; VariantInit(&arg2); V_bstref(&arg2)=&pbstrOut; V_VT(&arg2)=VT|BSTR | VT_BYREF; 变异检索; SafeArrayPutElement(safeArgs、索引和arg1); 索引++; SafeArrayPutElement(safeArgs、索引和arg2); BSTR methodString=SysAllocString(L“MyFunc”); hr=pType->InvokeMember_3(methodString,(BindingFlags)(BindingFlags_InvokeMethod | BindingFlags_Public | BindingFlags_Instance),NULL、obj、safeArgs和retVal; }
你能试试StringBuilder吗?将功能更改为:

public int MyFunc(string strin, ref StringBuilder strout)
    {
        strout.insert(0, strin);
        return strin.Length;
    }

由于字符串对象在.NET中是只读的,如果要更改字符串的内容,则应使用StringBuilder

完全相同的问题。我认为您无法让它工作,它只是在调用后不会将object[]元素封送回SAFEARRAY。通常需要在参数上[In,Out]来说服封送处理程序花时间将它们复制回来,这是不存在的。解决方案是通过IntPtr返回字符串的函数。