Delphi 2010: EOleSysError «Несоответствие типов» вызывает элемент управления ActiveX - PullRequest
5 голосов
/ 17 февраля 2012

У меня есть этот API ActiveX C (не имеют исходников, только двоичные файлы):

// \param a [out] Variant holding a byte array 
// \param b [out] Reference to a longlong (Signed 64-bit)
// \param c [out] Reference to a short
short foo(variant* a, longlong* b, short* c);

Он отлично работает в C #:

//auto-generated import:   
short foo(ref object a, ref long b, ref short c);

test {
 object a=null;
 long b=0;
 short c=0;
 foo(a,b,c); => OK 
}

NOK в Delphi 2010 (Обратите внимание, что {?? Int64} OleVariant добавлен инструментом импорта Delphi):

//auto-generated import:
function foo(var a: OleVariant; 
             var b: {??Int64}OleVariant; 
             var c: Smallint): Smallint;

procedure Test;
var
 a, b: OleVariant;
 c: Smallint;
begin
 foo(a,b,c); => **EOleSysError 'Type mismatch' exception**
end;

Ответы [ 2 ]

1 голос
/ 18 февраля 2012

longlong не является стандартным типом C ++.Я не могу сказать из кода C ++, какой тип использовать.

Теперь, на мой взгляд, легче работать с C #, где типы более понятны и надежны, чем C / C ++.В C # long это 64-разрядное целое число со знаком, поэтому Int64 в Delphi.Два других параметра в вашем фрагменте Delphi в вопросе указаны правильно.

1 голос
/ 18 февраля 2012

Вы можете использовать предопределенные типы WinAPI:

// C definition
short foo(variant* a, longlong* b, short* c);

// Delphi definition
function foo(var a: OleVariant; 
             var b: LongLong; 
             var c: Smallint); Smallint;

procedure FooTest;
var
  a: OleVariant;
  b: LongLong;
  c, RetVal: ShmallInt;
begin
  Retval := foo(a, b, c);
end;

LongLong определено в Windows.pas вместе со многими другими типами, совместимыми с WinAPI.(По крайней мере, они находятся в Windows подразделении через Delphi XE; XE2, возможно, переместил некоторые из них из-за кроссплатформенного и 64-битного перемещения.)

// Windows.pas definition (Delphi 2010)
type
  LONGLONG = int64;

Как Дэвид продолжает упоминатьв комментариях ниже longlong не является стандартным типом данных C ++.Однако, основываясь на комментариях, относящихся к параметрам в вашем обновлении, это точно , как и предполагал разработчик C ++, и, следовательно, определение WinAPI совместимо (и сохраняет то же имя для согласованности в целях документации).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...