2014-12-18 12 views
5

Mam uruchomiony skrypt instalacyjny Inno, w którym używam innocallback.dll przez Sherlock Software.Wywołanie C# DLL z Inno Setup z wywołaniem zwrotnym

Ta biblioteka DLL otacza procedurę, która może być przekazana do biblioteki DLL C#.

Nie chcę używać tej biblioteki DLL, chcę wywołać moją wyeksportowaną metodę C# bezpośrednio i przekazać do niej procedurę wywołania zwrotnego.

Moje pytanie brzmi:

Jak mogę przekazać moje postępowanie Inno Setup (@mycallback) do mojego C# DLL, dzięki czemu można go używać jako mój delegate/UnmanagedFunctionPointer?

Jak już powiedziałem ten kod działa, ale chcę użyć jak najmniej zewnętrznych bibliotek DLL.

Oto mój kod:

Inno Setup Script

type 
    TTimerProc=procedure(); 
    TProgressCallback=procedure(progress:Integer); 
    
function WrapProgressProc(callback:TProgressCallback; paramcount:integer):longword; 
    external '[email protected]:innocallback.dll stdcall'; 

function Test(callback:longword): String; 
    external '[email protected]:ExposeTestLibrary.dll stdcall'; 

var 
    endProgram : Boolean; 

procedure mycallback(progress:Integer); 
begin 
    MsgBox(IntToStr(progress), mbInformation, MB_OK);  
    if progress > 15 then 
    begin 
    endProgram := True; 
    end 
end; 
   
function InitializeSetup:boolean; 
var 
    progCallBack   : longword; 
    callback       : longword; 
    msg            : longword; 
    msg2           : widestring; 
begin 
    endProgram := False; 
    progCallBack:= WrapProgressProc(@mycallback,1); //Our proc has 1 arguments 
    Test(progCallBack); 
    result:=true; 
end; 

I to jest mój kod C#

public class TestClass 
{ 
    [UnmanagedFunctionPointer(CallingConvention.StdCall)] 
    public delegate void ReportProgress(uint progress); 

    public static ReportProgress m_reportProgess; 
    static uint m_iProgress; 
     
    [DllExport("Test", CallingConvention = CallingConvention.StdCall)] 
    static int Test(ReportProgress rProg) 
    { 
        m_iProgress = 0; 
        m_reportProgess = rProg; 
        System.Timers.Timer pTimer = new System.Timers.Timer(); 
        pTimer.Elapsed += aTimer_Elapsed; 
        pTimer.Interval = 1000; 
        pTimer.Enabled = true; 
        GC.KeepAlive(pTimer); 
        return 0; 
    } 

    static void aTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
    { 
        m_iProgress++; 
        m_reportProgess(m_iProgress); 
    } 
} 

Odpowiedz

2

Nie ma mowy, aby upuścić wykorzystanie opakowania Biblioteka InnoCallback, ponieważ po prostu nie można zdefiniować procedury oddzwaniania za pomocą konwencji wywołującej do wyboru w Inno Setup, ani nie możesz zdefiniować wywołania zwrotnego z konwencją wywołującą register (specyficzną dla kompilatora Delphi) w bibliotece C#.

Z tego powodu należy użyć zewnętrznej biblioteki, która opakowuje metodę wywołania zwrotnego z Inno Setup do funkcji z konwencją wywołania, którą może pobierać biblioteka (InnoCallback używa do tego celu stdcall).

To, o co prosisz, będzie możliwe, jeśli piszesz swoją bibliotekę w języku obsługującym konwencję wywoływania Delphi register. Z ciekawości, w Delphi można napisać np:

library MyLib; 

type 
    TMyCallback = procedure(IntParam: Integer; StrParam: WideString) of object; 

procedure CallMeBack(Callback: TMyCallback); stdcall; 
begin 
    Callback(123, 'Hello!'); 
end; 

exports 
    CallMeBack; 

begin 
end. 

A w Inno Setup to (bez biblioteki owijania):

[Setup] 
AppName=My Program 
AppVersion=1.5 
DefaultDirName={pf}\My Program 

[Files] 
Source: "MyLib.dll"; Flags: dontcopy 
[Code] 
type 
    TMyCallback = procedure(IntParam: Integer; StrParam: WideString); 

procedure CallMeBack(Callback: TMyCallback); 
    external '[email protected]:mylib.dll stdcall'; 

procedure MyCallback(IntParam: Integer; StrParam: WideString); 
begin 
    MsgBox(Format('IntParam: %d; StrParam: %s', [IntParam, StrParam]), 
    mbInformation, MB_OK); 
end; 

procedure InitializeWizard; 
begin 
    CallMeBack(@MyCallback); 
end; 
+1

Widziałem tylko masz na inno-setup Złota Odznaka . Gratulacje :) – Bongo

Powiązane problemy