C#DLL字符串C ++中的函数

时间:2016-02-25 02:53:58

标签: c# c++ dll

我试图弄清楚如何使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 ++中调用它?

1 个答案:

答案 0 :(得分:0)

欢迎使用COM和噩梦般的语法和扭曲,你必须经历一些简单的事情,比如返回一个字符串值。

每次调用COM都会返回一个HRESULT,无论你的实现调用试图返回什么。这通常是0来表示成功。任何其他值表示失败。你可能已经在Windows的错误消息中看到了这些疯狂的0x80001234类型的值 - 它们是HRESULT错误代码。

从C ++中doSomething的定义可以看出,你必须给出函数2的参数。

  1. 作为调用参数传入的字符串。
  2. 指向将收到结果的BSTR的指针。
  3. 然后相应地调整您的代码

    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;
    }