繁体   English   中英

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

[英]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个参数。

  1. 作为调用参数传递的字符串。
  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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM