将元素从C类型字符串数组传递给COM对象作为BSTR? (在C ++中)

时间:2009-02-25 16:25:54

标签: c++ c com bstr

我正在编写一个由外部程序调用的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的值,而不是单个字符。

3 个答案:

答案 0 :(得分:5)

如果您使用微软 ATL ,则可以使用CComBSTR课程。 它会接受一个char *并从中创建一个BSTR,你也不必担心删除BSTR,所有这些都发生在CComBSTR的dtor中。

另外,请参阅Matthew Xaviers回答,看起来您的字符串数组不正确地传递给该函数。

希望这有帮助

答案 1 :(得分:4)

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

DLL_EXPORT(void) runUnitModel(char **rateMaterialTypeNames)

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

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

答案 2 :(得分:3)

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

rateMaterialTypeNames [I]

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

另外,演员一般都不好。转换为BSTR是一个很大的标志。 SysAllocString的参数类型是

const 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