Здравствуйте.
Скажу сразу, на Delphi пытаюсь программировать второй день.
Проблема в следующем: имеется OLE-объект, написанный на С++.
OLE-объект экспортирует интерфейс, содержащий такую функцию:
HRESULT PrintLabel([in] BYTE bVersionNumber, [in] BSTR bstrData, [out,retval] SHORT *pResult);
в Delphi при импорте библиотеки типов получаем такую строчку
function PrintLabel(bVersionNumber: Byte; const bstrData: WideString): Smallint; safecall;
Вроде бы всё нормально, но ...
есть такой код на Delphi:
procedure TForm1.Button1Click(Sender: TObject);
var
Data : WideString;
Obj : variant:
begin
try
Obj := CreateoleObject('AutoTransportRMI.AztecObject');
Data := 'sdjkfjshgfmxbcvmxnbjehgrtjhgj jhsgfhsdgfjgs djfg';
Obj.PrintLabel( 1, Data );
except
on E: Exception do begin
MessageBox(handle, PChar('OLE-object error: '+E.Message), 'Error', MB_ICONERROR or MB_OK);
Exit;
end;
end;
end;
Во время выполнения PrintLabel возникает ошибка EOleSysError "Несовпадение типов".
При этом, если изменить
Data := 'sdjkfjshgfmxbcvmxnbjehgrtjhgj jhsgfhsdgfjgs djfg';
Obj.PrintLabel( 1, Data ) );
на
Obj.PrintLabel( 1, 'sdjkfjshgfmxbcvmxnbjehgrtjhgj jhsgfhsdgfjgs djfg' );
всё корректно отрабатывает.
Если я меняю BSTR на BSTR* в OLE-функции, т.е.
HRESULT PrintLabel([in] BYTE bVersionNumber, [in] BSTR* pbstrData, [out,retval] SHORT *pResult);
тоже всё хорошо работает.
Такие проблемы со всеми функциями, содержащих BSTR в качестве входного параметра.
Вопрос, что я делаю неправильно. Поиск ответа в интернете в течении двух дней ответа не принес