0

CreateProcess()インストーラーから正常に呼び出すことができませんでした。

次のCコード(Win7でMinGWを使用してコンパイル)はnotepad.exe問題なく開始できます。

#include <windows.h>
#include <stdio.h>

int main(int argc, char *argv[]){

    BOOL result;
    STARTUPINFO startupInfo;
    PROCESS_INFORMATION processInformation;

    memset(&startupInfo,0, sizeof(STARTUPINFO));
    startupInfo.cb = sizeof(startupInfo);
    memset(&processInformation, 0, sizeof(PROCESS_INFORMATION));

    //these 2 values are used for NSIS
    printf("sizeof(startupInfo) = %d\n",sizeof(startupInfo));
    printf("sizeof(processInformation) = %d\n",sizeof(processInformation));

    result = CreateProcess(NULL, "NOTEPAD.exe", 
                          NULL,
                          NULL,
                          FALSE,
                          0,
                          NULL,
                          NULL,
                          &startupInfo,
                          &processInformation
                        );
    if(result == 0)
        printf("Could not create process, lasterr =  %ld\n", GetLastError());

}

この同等のNSISスクリプトは、WinXpとWin7の両方でひどく失敗します。

!include "TextFunc.nsh"
!include "logiclib.nsh"
outfile "process.exe"

!define DEBUG `System::Call kernel32::OutputDebugString(ts)`
Var cmd

Section

StrCpy $cmd "notepad.exe"
;System::Alloc 72           ;// $1 = struct STARTUPINFO
;Pop $1
System::Call "*(i 68, i 0, i 0, i 0, i 0, i 0, i 0, i 0, i 0, i 0, i 0, i 0, &i2 0, &i2 0, i 0, i 0, i 0, i 0) p.r1"        ;// StartUp.cb=sizeof(StartUp);

;System::Alloc 16           ;// $2 = struct PROCESS_INFORMATION
;Pop $2
System::Call "*(i 0, i 0, i 0, i 0) p.r2"

;System::Call "*$1(i 68)"       ;// StartUp.cb=sizeof(StartUp);
System::Call /NOUNLOAD 'kernel32::CreateProcess(i 0, t $cmd, i 0, i 0, i 0, i 0, i 0, i 0, i r1, i.r2)i.r0 ?e'
Pop $9
${debug} "$0 lasterr=$9"
StrCmp $0 "0" 0 Good
MessageBox MB_OK "CreateProcess failed"
${debug} "CreateProcess failed"
Goto Free
Good:
${debug} "get infos"
System::Call "*$2(i.r3,i.r4,i.r5,i.r6) ?!e"
${debug} "PHND=$3 PID=$5"
System::Call 'kernel32::CloseHandle(i $3)'
System::Call 'kernel32::CloseHandle(i $4)'
Free:
System::Free $1
System::Free $2

SectionEnd

System::Calfor構造体の割り当てを置き換えてSystem::Alloc代わりに使用すると、クラッシュは発生しませんが、CreateProcess失敗しGetLastErrorて87(ERROR_INVALID_PARAMETER)を返します。

それを修正するために私は何が欠けていCreateProcessますか?nsisスクリプトからアクセスできないフラグでExec遊んでみたかったので、組み込みを使用したくありません。CreateProcess

編集:エラーが発生しました:CreateProcess最後の引数の呼び出しでは、次のようにするi.r2必要がありますir2:のメモリブロックPROCESS_INFORMATIONはすでに割り当てられており、そのポインタはに渡される必要がありますがCreateProcessi.r2は呼び出し前の値を無視し、後でのみ取得します。アンダースの助けに感謝します:)

4

1 に答える 1

3

pNSIS 2.46を使用していて、STARTUPINFOのサイズが間違っていると思われる場合は、は有効なタイプではありません。

Section 
System::Call '*(i,i,i,i)i.r0'
System::Alloc 72
pop $4
System::Call "*$4(i 72)"
StrCpy $1 '"explorer.exe" "$startmenu"'
System::Call 'kernel32::CreateProcess(i0,tr1,i0,i0,i0,i 0,i0,i0,ir4,ir0)i.r3'
DetailPrint RET=$3
System::Free $4
${If} $3 <> 0
    System::Call "*$0(i.r3,i.r4)"
    System::Call 'kernel32::CloseHandle(i $3)'
    System::Call 'kernel32::CloseHandle(i $4)'
${EndIf}
System::Free $0
SectionEnd
于 2012-12-19T20:40:05.683 に答える