我正在写一个C#com库。我需要一个从C ++中获取字符串并修改字符串的函数,在我修改了我的库中的字符串后,修改后的值应该可以被C ++代码使用。这是我的功能(它不起作用),
C#界面,
Int32 testString([param: MarshalAs(UnmanagedType.LPStr)] ref string strData);
C#Implementation,
class Test:ITest
{
public int testString(ref string strData)
{
strData = strData + strData;
Console.WriteLine("strData in lib :"+strData);
return 0;
}
}
C ++代码(我错过了部分,注册了com lib,导入了tlb等),
ITest * mInterface = NULL;
//...initilizing interface , skipped since this parts has no problem
LPSTR tt = "OLA";
mInterface ->testString(&tt); //It crashes when comes here ..
cout << tt <<endl;
答案 0 :(得分:0)
我已经找到了解决我的问题的方法,我不确定但也许我们不能使用com interop从c ++到c#初始化对象。如果使用一个指向c#com的空指针,并在c#库代码中初始化该指针它有效你可以看到下面的样本;
c#library interface
int testString(out string val);
c#library imp
class Test
{
int testString(out string val)
{
val = "Hello world"; //now user of this method can use val
return 0;
}
}
c ++用法
#pragma warning (disable: 4278)
#import "../yourtlb.tlb" no_namespace named_guids
ITestInterface * fpInterface = NULL;
int retval = 1;
CoInitialize(NULL);
HRESULT hr = CoCreateInstance(CLSID_Test ,
NULL, CLSCTX_INPROC_SERVER,
IID_ITestInterface, reinterpret_cast<void**>(&fpInterface));
if(!FAILED(hr))
{
BSTR val = NULL;
int ret = fpInterface->testString(val);
cout <<val<<endl;
}
当然在使用c ++中的代码之前,不要忘记从c#项目生成tlb文件,不要忘记编辑注册表文件。Here you can see a good sample