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