【问题标题】:Pass an element from C type string array to a COM object as BSTR? (in C++)将 C 类型字符串数组中的元素作为 BSTR 传递给 COM 对象? (在 C++ 中)
【发布时间】:2010-10-09 20:39:11
【问题描述】:

我正在编写一个由外部程序调用的 C++ DLL。

1.) 我将一个字符串数组(作为 char *var)作为该程序的参数。

2.) 我想遍历这个数组并在字符串数组的每个元素上调用一个 COM 函数。 COM 函数必须采用 BSTR:

DLL_EXPORT(void) runUnitModel(char *rateMaterialTypeNames) {

    HRESULT hr = CoInitialize(NULL);

    // Create the interface pointer.
    IUnitModelPtr pIUnit(__uuidof(BlastFurnaceUnitModel));

    pIUnit->initialiseUnitModel();

    int i;
    for(i=0; i < sizeOfPortRatesArray; i++)
            pIUnit->createPort(SysAllocString(BSTR((const char *)rateMaterialTypeNames[i])));

我认为它的 SysAllocString(BSTR((const char *)rateMaterialTypeNames[i])) 位给我带来了问题。程序运行时出现访问冲突。

这是在 i 处访问 rateMaterialTypeName 值的正确方法吗?请注意,我期望像“IronOre”这样的值作为 i 的值,而不是单个字符。

【问题讨论】:

  • 谢谢大家,CComBSTR 成功了。感谢您找到双指针错误 Mathew!

标签: c++ c com bstr


【解决方案1】:

如果您使用的是 Microsoft 的 ATL,则可以使用 CComBSTR 类。 它将接受一个 char* 并从中创建一个 BSTR,此外,您无需担心删除 BSTR,所有这些都发生在 CComBSTR 的 dtor 中。

另外,请参阅Matthew Xaviers 答案,您似乎没有正确地将字符串数组传递给该函数。

希望对你有帮助

【讨论】:

    【解决方案2】:

    因为保存 C 字符串的变量只是指向第一个元素的指针(一个 char*),所以为了传递一个 C 字符串数组,函数的参数应该是一个 char**:

    DLL_EXPORT(void) runUnitModel(char **rateMaterialTypeNames)
    

    这样,当您评估 rateMaterialTypeNames[i] 时,结果将是一个 char*,这是您需要传递给 SysAllocString() 的参数类型。

    补充说明:您还需要在某些时候将字符串转换为宽字符,正如 Tommy Hui 的回答所指出的那样。

    【讨论】:

    • +1 用于发现参数问题。有关创建 BStr 的简单但特定于 ATL 的方法,请参阅我的答案
    【解决方案3】:

    如果函数rateMaterialTypeNames的参数是字符串,那么

    rateMaterialTypeNames[i]

    是一个字符,而不是一个字符串。您应该只使用参数名称本身。

    此外,演员阵容一般都很糟糕。转换为 BSTR 是一个很大的标志。 SysAllocString 的参数类型是

    常量 OLECHAR*

    对于 32 位编译器来说是一个宽字符。所以这肯定会失败,因为实际参数是 char*。

    代码需要的是窄字符串到宽字符串的转换。

    const OLECHAR* pOleChar = A2COLE( *pChar );
    BSTR str = SysAllocString( pOleChar );
    // do something with the 'str'
    SysFreeString( str ); // need to cleanup the allocated BSTR
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-10
      • 1970-01-01
      • 2012-08-21
      • 1970-01-01
      • 2018-07-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多