Ho uno script Inno Setup in esecuzione, in cui utilizzo innocallback.dll da Sherlock Software.Chiama DLL C# da Inno Setup con callback
Questa DLL esegue il wrapping di una mia procedura in modo che possa essere passata a una DLL C#.
Non voglio usare questa DLL, voglio chiamare direttamente il mio metodo C# esportato e passare ad esso la procedura di callback.
La mia domanda è:
Come posso passare la mia procedura Inno Setup (@mycallback
) al mio C# DLL in modo che posso usarlo come mio delegate
/UnmanagedFunctionPointer
?
Come ho detto, questo codice funziona, ma voglio utilizzare il minor numero possibile di DLL esterne.
Ecco il mio codice:
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;
E questo è il mio codice 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);
}
}
Ho appena visto che hai il distintivo d'oro inno-setup . Complimenti :) – Bongo