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);
}
}
Widziałem tylko masz na inno-setup Złota Odznaka . Gratulacje :) – Bongo