On Mon, 16 Dec 2013 10:53:45 -0000, Hugo Florentino <h...@acdam.cu> wrote:
I am writing a launcher to make a Windows application portable, but since this application supports both x86 and x86_64, I would like to detect the architecture of the OS my launcher is being run on, in order to launch the proper executable.

How can I do this?

Compile the launcher as 32bit, and use this global boolean "isWow64":

import std.stdio;
import std.internal.windows.advapi32;

void main(string[] args)
{
  writefln(isWow64 ? "yes" : "no");
}

You can thank Kenji for this one :) Someone document this somewhere please :p

The code from advapi32 for those interested..

immutable bool isWow64;

shared static this()
{
// WOW64 is the x86 emulator that allows 32-bit Windows-based applications to run seamlessly on 64-bit Windows // IsWow64Process Function - Minimum supported client - Windows Vista, Windows XP with SP2
    alias extern(Windows) BOOL function(HANDLE, PBOOL) fptr_t;
    auto hKernel = GetModuleHandleA("kernel32");
auto IsWow64Process = cast(fptr_t) GetProcAddress(hKernel, "IsWow64Process");
    BOOL bIsWow64;
isWow64 = IsWow64Process && IsWow64Process(GetCurrentProcess(), &bIsWow64) && bIsWow64;
}

Basically, your 32 bit launcher process has to, at runtime, ask Kernel32 for a function "IsWow64Process" which only exists on 64 bit windows. So, if it doesn't find it, it's 32 bit. If it finds it, it calls it with the current PID to find out of the current process is a 32 bit app running inside WOW64 (the emulator layer) and that gives you the answer.

R


--
Using Opera's revolutionary email client: http://www.opera.com/mail/

Reply via email to