2012-09-12 35 views
1

我想將一個字符串傳遞給我的dll函數,但該函數無法獲取該值。 首先我使用GetMyParam函數從cmd行獲取字符串。這是正確的。然後,我通過 值使用innotest函數我的dll。從inno傳遞字符串到dll時無法獲取dll函數的值?

function innotest(PName:string):Integer; 
external '[email protected]:\client\branch\maintain\1.4\bin\sdostate-debug\update.dll stdcall setuponly'; 

function GetMyParam(PName:string):string; 
var 
    CmdLine : String; 
    CmdLineLen : Integer; 
    i : Integer; 
begin 
    Result := ''; 
    CmdLineLen:=ParamCount(); 
    for i:=0 to CmdLineLen do 
    begin 
    CmdLine:=ParamStr(i); 
    if CmdLine = PName then 
     begin 
      CmdLine:=ParamStr(i+1); 
      Result := CmdLine; 
      Exit; 
     end; 
    end; 
end; 

procedure CurStepChanged(CurStep: TSetupStep); 
var 
res: String; 

begin 
if (CurStep = ssPostInstall) and (Pos('setup', WizardSelectedTasks(false)) > 0)then 
begin 
res := GetMyParam('-myParam'); 
MsgBox(res, mbInformation, mb_Ok); 
innotest(res); 
end; 
end; 

Msgbox具有res值。 這裏是我的dll代碼:字符串的長度爲1

DWORD Update::innotest(string str) 
{ 
    LPCWSTR s = StringHelper::ANSIToUnicode(str).c_str(); 
    MessageBox(0,s,0,0); 
    return 0; 
} 
+0

什麼版本的InnoSetup你使用ANSI和Unicode?如果是ANSI,那麼這是不可能的。您必須使用Unicode版本的InnoSetup,因爲您在庫中使用了LPCWSTR Unicode字符串,並且當您有ANSI版本的InnoSetup時,字符串會映射到ANSI字符串,並且Unicode字符串沒有類型。 – TLama

+0

我已經實現了將Ansi字符串轉換爲Unicode的StringHelper。這種方式不起作用? – user861491

+0

對不起,我的壞。你的函數有ANSI字符串作爲參數('str'是ANSI字符串),你有Unicode InnoSetup,對不對?如果是這樣,那麼在InnoSetup函數import中將你的參數改爲'PName:AnsiString',你會沒事的。 – TLama

回答

2

您使用您的函數參數類型string,什麼是內存中的字符序列,即InnoSetup不能直接到達。您必須使用指向字符串類型的指針才能使其工作。因此,當您使用Unicode InnoSetup時,請更改您的庫函數參數,使其具有以下方式的Unicode字符串指針類型。那麼你可以保持你的InnoSetup腳本原樣:

DWORD Update::innotest(LPCWSTR str) 
{ 
    MessageBox(0,s,0,0); 
    return 0; 
} 
+1

實際上,使用'string'作爲參數可能是'std :: string',它不僅僅是一個簡單的字符序列,而且完全不兼容作爲混合語言DLL函數參數。 (作爲一個方面說明,即使在你自己的庫中,你也不應該試圖通過值傳遞字符串。) – Miral