Deploying Windows applications on Linux(Wine) with InnoSetup
First, we need to detect Wine in the InnoSetup script.
function LoadLibraryA(lpLibFileName: PAnsiChar): THandle;
external 'LoadLibraryA@kernel32.dll stdcall';
function GetProcAddress(Module: THandle; ProcName: PAnsiChar): Longword;
external 'GetProcAddress@kernel32.dll stdcall';
function IsWine: boolean;
var LibHandle : THandle;
begin
LibHandle := LoadLibraryA('ntdll.dll');
Result:= GetProcAddress(LibHandle, 'wine_get_version')<> 0;
end;
The IsWine function returns true, if the installer is launched under Wine. My application (Image Uploader) is extensively using Microsoft Gdi+ library, but Wine's implementation of this library is incomplete, so I had no other choice but to install the native version of gdiplus.dll. The important thing is to tell Wine to use the native library instead of the built-in one, it can be achieved by writing a setting to the Wine's registry.
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep=ssPostInstall and IsWine then
begin
filecopy(expandconstant('{tmp}\gdiplus.dll'),expandconstant('{app}\gdiplus.dll'),false);
RegWriteStringValue(HKEY_CURRENT_USER, 'Software\Wine\DllOverrides',
'gdiplus', 'native, builtin');
end;
end;
There are some other issues when Image Uploader is running in Wine, for example, Wine is ignoring WM_CTLCOLORSTATIC message's result, also Richedit's EM_FORMATRANGE is not working. But I hope I'll find a workaround for these issues too.