将托管字符串(C#)转换为LPCOLESTR(C ++)

时间:2010-08-18 00:45:54

标签: c# c++ types

我在C ++中挥动一个接收LPCOLESTR类型参数的方法。我通过C#访问此方法,但我无法在String和此类型之间进行正确的转换。

让我们说C ++中的signinature方法是:

void Something(LPCOLESTR str)

在C#中,我正在尝试调用它(通过DLL访问该方法的所有引用问题已经解决):

String test = "Hello world";
Something(test);

但当然没有运气。如果有人能帮助我,我会很高兴。谢谢!


代码段:

例如,这是我的C ++部分代码,在MixedCodeCpp.h(CLR类库)文件中定义

#include "windows.h"  
#pragma once  
using namespace System;

namespace MixedCodeCpp
{
    public ref class MyClass
    {
    public:
        HRESULT Something(LPCOLESTR str)
        {
            return S_OK;
        }
    };
}

这是我在C#中的代码(我通过Visual Studio在C#项目中添加了对C ++项目的引用):

StringBuilder sb = new StringBuilder();  
sb.Append("Hello world");  
MixedCodeCpp.MyClass cls = new MixedCodeCpp.MyClass();  
cls.Something(sb);

2 个答案:

答案 0 :(得分:1)

参数将在C#侧显示为Char *。这需要不安全的代码,如下所示:

    unsafe static void CallSomething(MyClass obj, string arg) {
        IntPtr mem = Marshal.StringToCoTaskMemUni(arg);
        try {
            obj.Something((Char*)mem);
        }
        finally {
            Marshal.FreeCoTaskMem(mem);
        }
    }

使非常将LPCOLESTR公开给其他托管代码没什么意义。这个方法真的应该接受一个String ^并在内部转换为wchar_t *。

答案 1 :(得分:0)

尝试使用StringBuilder而不是String:

System.Text.StringBuilder test = new System.Text.StringBuilder ();
test.Append("Hello world");
Something(test);

我在pinvoke中以这种方式使用它,需要各种字符串指针作为参数的Win32函数。不确定它是否适用于您的API,但值得一试。这是关于流程的some MSDN info。并here is another

以下是您的import语句和声明应该是什么样子的任意示例。 (要带上一粒盐。)

[DllImport(SomeLib.SomeName, CharSet = CharSet.Unicode, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool Something(StringBuilder pMyString);

StringBuilder str = new StringBuilder(MAX_PATH); 
DWORD uSize;

bool b = Something(str);