【问题标题】:Pass String in C++ COM dll from C# function从 C# 函数在 C++ COM dll 中传递字符串
【发布时间】:2015-06-26 05:13:23
【问题描述】:

dll的函数接口;

我认为在 dll 中的函数看起来像,数据类型为 BSTR

CustomConvert(BSTR dataStr)

{........}

dll接口:

CustomConvert(IntPtr dataStr)    //Returns strings

我需要传递的数据是这样的:

string strTemp = "pŒ®í§…Êtf°B²bßZÃQô"; // something like this
obj.CustomConvert(strTemp);

但我收到异常“字符串”无法转换为“System.IntPtr”; 在互联网上搜索后,我发现了类似的东西。

obj.CustomConvert(System.Runtime.InteropServices.Marshal.StringToBSTR(strTemp));

但是 System.Runtime.InteropServices.Marshal.StringToBSTR(strTemp) 将 strTemp 转换为数字,例如 2035295。但我需要在 strTemp 中传递实际值。

有什么帮助或建议吗?

【问题讨论】:

    标签: c# c++ .net-4.5 intptr


    【解决方案1】:

    要传递BSTR,您可以执行以下操作:

    public static extern void CustomConvert([MarshalAs(UnmanagedType.BStr)] string dataStr);
    

    然后不做任何事情直接传递string

    请注意,在 CustomConvert 中,您不能释放 BSTR,因为它是由 C#“拥有”的。

    【讨论】:

    • @NearlyCrazy Ah... 那么obj.CustomConvert(System.Runtime.InteropServices.Marshal.StringToBSTR(strTemp)); 是正确的。请记住,您必须使用Marshal.FreeBSTR 释放它,因此最好使用变量,例如IntPtr temp = Marshal.StringToBSTR(strTemp); obj.CustomConvert(temp); Marshal.FreeBSTR(temp);
    • 只是好奇:如果我不使用 FreeBSTR 会怎样??
    • @NearlyCrazy 有人必须释放分配给BSTR 的内存。遗憾的是,并不总是清楚必须这样做。通常,如果您调用传递BSTR 的方法,调用者(您)将保持BSTR 的所有权,因此必须释放它。显然,如果您调用返回 BSTR 的方法,则调用者(您)将获得 BSTR 的所有权并必须释放它。
    • @xanatos:我刚刚实施了你的建议。但是当我运行“Marshal.FreeBSTR(temp);”时。我的“Visual Studio”停止了,但 try catch 没有异常。
    • @xanatos 遗憾的是,并不总是清楚谁必须这样做,而 通常 是这里的关键字 :-) 显然它已经被释放了通过调用的方法。删除Marshal.FreeBSTR(temp) 并在某处注释该方法似乎释放了传递的BSTR
    猜你喜欢
    • 1970-01-01
    • 2020-09-11
    • 2012-02-12
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    • 1970-01-01
    相关资源
    最近更新 更多