[英]C# DLL string Function in C++
我试图弄清楚如何使C#DLL与C ++一起工作。 我已经得到一个简单的函数,如int add(int a, int b) { return a + b; }
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
-type参数。 我想我真的只是想知道为什么会这样。 甚至有可能完成我想做的事情? 要在C#中创建字符串函数并在C ++中调用它?
欢迎使用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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.