2010-02-06 12 views
6

पैरामीटर के साथ एसी # एप्लिकेशन एसी # -method के अंदर कॉलबैक को डेल्फी डीएल से कॉल किया जाना है: सी # विधि को कॉल किया जाता है, लेकिन int param सही ढंग से स्थानांतरित नहीं होता है: कुछ "यादृच्छिक" मान आता है।डेल्फी डीएल से सी # ऐप

सी # -method एक रजिस्टर विधि के माध्यम से डेल्फी dll को पारित कर दिया है:

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; 

क्या भी दिलचस्प है:

[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 

    } 

और यहाँ डेल्फी कोड है कॉलबैक विधि हो जाता है दो बार बुलाया जाता है (दोनों बार "यादृच्छिक" मान आता है) हालांकि इसे कोड में केवल एक बार कहा जाता है। उसके बाद ऐप निकास कोड (0xc0000005) के साथ दुर्घटनाग्रस्त हो जाता है।

कोई विचार?

उत्तर

4

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

त्रुटि पाई का प्रयास करें:

भूल गया "stdcall" डेल्फी में:

प्रकार TCallback = प्रक्रिया (वैल: पूर्णांक); stdcall;

+0

ओह, यह नहीं देखा कि यह पहले से ही gamecat द्वारा जवाब दिया गया था ... – bert

संबंधित मुद्दे