我试图弄清楚如何使C#DLL与C ++一起工作。我已经得到了一个像int add(int a, int b) { return a + b; }
这样的简单函数,但是我似乎无法使string
函数起作用。我知道C#中的string
与C ++中的任何类型都不同,但这里是代码,我想知道到底发生了什么。
C#:
namespace DllTest
{
[ComVisible(true)]
public interface MyClass
{
string doSomething(string a);
}
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
public class Class1 : MyClass
{
public string doSomething(string a)
{
return a;
}
}
}
C ++:
#include <iostream>
#include <Windows.h>
#import "C:\Users\Archie\Documents\Visual Studio 2013\Projects\DllTest\DllTest\bin\Debug\DllTest.tlb" raw_interfaces_only
using namespace DllTest;
int main()
{
CoInitialize(NULL);
MyClassPtr obj;
obj.CreateInstance(__uuidof(Class1));
std::cout << obj->doSomething("Hello");
CoUninitialize();
}
当我调用该函数时,实际上我得到一个错误,说我错过了一个参数,但情况并非如此。这是我在使用C ++时查看doSomething
定义时弹出的内容:
virtual HRESULT __stdcall doSomething (
/*[in]*/ BSTR a,
/*[out,retval]*/ BSTR * pRetVal ) = 0;
看起来该函数实际上现在返回long
,并带有两个wchar_t
类型参数。我想我真的只是想知道为什么会这样。是否有可能完成我想要做的事情?在C#中创建字符串函数并在C ++中调用它?
答案 0 :(得分:0)
欢迎使用COM和噩梦般的语法和扭曲,你必须经历一些简单的事情,比如返回一个字符串值。
每次调用COM都会返回一个HRESULT,无论你的实现调用试图返回什么。这通常是0
来表示成功。任何其他值表示失败。你可能已经在Windows的错误消息中看到了这些疯狂的0x80001234类型的值 - 它们是HRESULT错误代码。
从C ++中doSomething
的定义可以看出,你必须给出函数2的参数。
BSTR
的指针。然后相应地调整您的代码
MyClassPtr obj;
obj.CreateInstance(__uuidof(Class1));
BSTR result = 0;
DWORD hr = obj->doSomething("Hello", &result);
if (hr != 0)
{ //handle error conditions.
}
else
{ // we've had success ...
_bstr_t str(result);
std::cout << str;
}