2012-02-17 16 views
5

tengo esta API C ActiveX (no tienen las fuentes sólo los binarios):Delphi 2010: EOleSysError 'no coincide el tipo' llamando control ActiveX

// \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); 

que está funcionando muy bien en 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 en Delphi 2010 (Tenga en cuenta que {} ?? Int64 OleVariant se añade por la herramienta de importación de 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; 
+0

de acuerdo con esto (http://www.netcoole.com/delphi2cs/datatype.htm) long = int64 en Delphi – ComputerSaysNo

+1

también, longlong es un entero de 64 bits con signo – OnTheFly

+0

@Dorin C/C++ long tiene 32 bits en Windows. –

Respuesta

1

Puede utilizar los tipos predefinidos: 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 se define en Windows.pas, junto con muchos, muchos tipos compatibles otra WinAPI. (Por lo menos están en la unidad a través de Windows Delphi XE; XE2 puede haber vuelto a poner algunos de ellos debido a la plataforma cruzada y 64 bits reubicaciones relacionados.)

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

Como David mantiene mencionar en los comentarios , longlong no es un tipo de datos C++ estándar. Sin embargo, en función de los comentarios relacionados con los parámetros en su actualización, es exactamente lo que el desarrollador de C++ pretendía que sea, y por lo tanto la definición de WinAPI es compatible (y conserva el mismo nombre para la coherencia a efectos de documentación).

+0

Smallint es lo que quiere aquí para que coincida corto. En cuanto a la larga, eso no es estándar, así que tenemos que adivinar. –

+0

LONGLONG no es necesariamente lo mismo que longlong. –

+0

Arrgh! Gracias, David. Enfocado demasiado en 'longlong'. (Ha estado presente en la unidad 'Windows' durante más tiempo que' Int64' en Delphi, y fue declarado compatible con la documentación de WinAPI; creo que quien haya escrito el código C++ también estaba familiarizado con él desde la API; de lo contrario, probablemente no lo habrían usado. :) Además, se usa en una biblioteca ActiveX de C++, lo que significa una familiaridad necesaria con los tipos de datos compatibles con WinAPI. Creo que la presunción de que son compatibles estaría a salvo hasta que se demuestre lo contrario (porque no funciona). –

1

longlong no es un tipo estándar de C++. No puedo decir desde el código C++ qué tipo usar.

Ahora, desde mi punto de vista, es más fácil trabajar desde C# donde los tipos son más inteligibles y confiables que C/C++. En C# long hay un entero de 64 bits con signo, por lo que Int64 en Delphi. Los otros dos parámetros en su fragmento Delphi en la pregunta se especifican correctamente.

+0

Muchas gracias, funciona con Int64. Parece obvio en retrospectiva, pero no se me ocurrió cambiar el control ActiveX importado, ya que se generó automáticamente. Me pregunto por qué pone una Variante, tal vez Delphi se confunde con la larga no estándar. – Sergio

Cuestiones relacionadas