2

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

4

3 回答 3

5

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

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

希望这可以帮助

于 2009-02-25T16:52:01.097 回答
4

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

DLL_EXPORT(void) runUnitModel(char **rateMaterialTypeNames)

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

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

于 2009-02-25T16:38:32.643 回答
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
于 2009-02-25T16:38:29.117 回答