2010-02-06 24 views
6

Dentro de la aplicación de CA # aC# -metodo con el parámetro debe invocarse desde un archivo DLL delphi: Se llama al método C#, pero el parámetro int no se transfiere correctamente: algún valor "aleatorio" llegaDevolución de llamada desde Delphi dll a la aplicación C#

El C# -method se pasa a la DLL de Delphi a través de un método de registro:

[UnmanagedFunctionPointer(CallingConvention.ThisCall)] 
    public delegate void ProcDelegate(int value); 

    private static ProcDelegate procDelegate; 

    [DllImport("CallbackTest.dll", CallingConvention = CallingConvention.StdCall)] 
    public static extern void RegisterCallback(ProcDelegate callBackHandle, int value); 


    public Form1() 
    { 
     InitializeComponent(); 

     procDelegate = new ProcDelegate(CalledFromDelphi); 

     RegisterCallback(procDelegate, 10); // register in delphi dll 


    } 

    public static void CalledFromDelphi(int value) 
    { 
     MessageBox.Show("Value:" + value); // expect "10", but getting random value 

    } 

Y aquí es el delphi código:

type TCallback = procedure(val: integer); 
var callback : TCallback; 
procedure RegisterCallback(aCallback : TCallback; value: integer); stdcall; 
begin 
    callback:= aCallback; 
    ShowMessage('Inside Delphi:'+ IntToStr(value)); // successful ("10") 

    callback(value); // ...and test callback 
end; 

exports 
    RegisterCallback; 

Lo que también es interesante: el método de devolución de llamada se pone llamado dos veces (ambas veces llega un valor "aleatorio") aunque solo se llama una vez en el código. Después de eso, la aplicación se bloquea con el código de salida (0xc0000005).

¿Alguna idea?

Respuesta

4

Trate

type TCallback = procedure(val: integer); stdcall; 
0

conocer el error:

olvidó "stdcall" en Delphi:

tipo TCallback = procedimiento (val: número entero); stdcall;

+0

oh, no veo que ya haya sido respondido por gamecat ... – bert

Cuestiones relacionadas