1

dll 関数に文字列を渡したいのですが、関数が値を取得できません。まず、GetMyParam 関数を使用してコマンド ラインから文字列を取得します。そうです、innotest 関数を使用して dll に値を渡します。

function innotest(PName:string):Integer;
external 'innotest@E:\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;
}
4

1 に答える 1

2

stringInnoSetupが直接到達できない、メモリ内の文字のシーケンスである関数パラメータでtypeを使用しています。文字列型を機能させるには、文字列型へのポインタを使用する必要があります。したがって、Unicode InnoSetupを使用している場合は、ライブラリ関数パラメーターを変更して、Unicode文字列ポインターを次のように入力します。次に、InnoSetupスクリプトをそのままにしておくことができます。

DWORD Update::innotest(LPCWSTR str)
{
    MessageBox(0,s,0,0);
    return 0;
}
于 2012-09-12T10:03:43.473 に答える