Передать элемент из строкового массива типа C в COM-объект как BSTR? (в C ++) - PullRequest
2 голосов
/ 25 февраля 2009

Я пишу 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])), который доставляет мне проблемы. Я получаю нарушение прав доступа при запуске программ.

Это правильный способ доступа к значению rateMaterialTypeName в i? Обратите внимание, что я ожидаю что-то вроде «IronOre» в качестве значения в i, а не один символ.

Ответы [ 3 ]

5 голосов
/ 25 февраля 2009

Если вы используете Microsoft ATL , вы можете использовать класс CComBSTR . Он примет char * и создаст из него BSTR, также вам не нужно беспокоиться об удалении BSTR, все, что происходит в dtor для CComBSTR.

Кроме того, см. Мэтью Ксавье ответ, не похоже, что вы правильно передаете свой массив строк в эту функцию.

Надеюсь, это поможет

4 голосов
/ 25 февраля 2009

Поскольку переменная, содержащая строку C, является просто указателем на первый элемент (символ *), для передачи массива строк C параметр вашей функции должен быть символом **:

DLL_EXPORT(void) runUnitModel(char **rateMaterialTypeNames)

Таким образом, когда вы оцениваете rateMaterialTypeNames [i], результатом будет символ *, который является типом параметра, который нужно передать в SysAllocString ().

Добавлено примечание: вам также понадобится преобразовать строки в широкие символы в какой-то момент, как указывает ответ Томми Хуэя.

3 голосов
/ 25 февраля 2009

Если параметром функции rateMaterialTypeNames является строка, то

rateMaterialTypeNames [я]

это символ, а не строка. Вы должны использовать только само имя параметра.

Кроме того, броски вообще плохие. Преобразование в 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
...