アセンブリを使用してパラメーターにアクセスする必要がありますWinMain
が、スタック内のどこにあるかを知っていると思われるにもかかわらず、アクセスできないようです (DWORD オフセット 0 から 16、および操作前に EBP をプッシュする場合は 0 から 20)。以下に、プログラムのコマンド ラインlpszCmdline
を含む文字列を表示する例を示しますが、常に 0 が含まれているように見えるため、何も表示されません。アセンブリ コードで他の引数を使用しようとすると、有効な文字列ポインターが存在しないように見えたり、予想どおりプログラムがクラッシュしたりします。
;[esp+20]==nCmdShow
;[esp+16]==lpszCmdLine
;[esp+12]==0 in win32
;[esp+8]==hInst
;[esp+4]==EIP
;[esp+0]==EBP
push ebp
mov ebp,esp
mov eax,[ebp+16]
push dword 0x00001030 ;UINT uType
push eax ;LPCTSTR lpCaption
push eax ;LPCTSTR lpText
push dword 0 ;HWND hWnd
call dword[MessageBoxA@USER32.DLL]
pop ebp
ただし、使用するGetCommandLine
と、コマンドライン文字列への有効なポインターを取得でき、表示されます。
call dword[GetCommandLineA@KERNEL32.DLL]
push dword 0x00001030 ;UINT uType
push eax ;LPCTSTR lpCaption
push eax ;LPCTSTR lpText
push dword 0 ;HWND hWnd
call dword[MessageBoxA@USER32.DLL]
最初のコード ブロックのどこにエラーがありますか? パラメータを取得するには何が必要で、独自のコードを実装して有効なポインタを結果として他のパラメータに返すことができるlpszCmdLine
ようにする必要がありますか? GetCommandLine
WinMain
スタックからコマンド ライン ポインターを取得できない場合は、nCmdShow
他の重要な初期化用の などの他のパラメーターを取得できない可能性があります。
上記以外のコードが必要な場合はお知らせください。知っておくと便利な場合は、リンカを使用せずに完全に手動で EXE を生成しました (追加のスタック パラメータのように、.NET に違いはありますか?) 。WinMain
含まれるプログラムの2つの異なるオプションになります。