2012-09-12 1 views
1

문자열을 내 dll funcfion에 전달하려고하지만 함수에서 값을 가져올 수 없습니다. 먼저 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 코드입니다 : 당신은 InnoSetup 직접 도달 할 수없는 메모리에 일련의 문자 어떤 함수 매개 변수 string 유형을 사용하고 1

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

InnoSetup의 어떤 버전을 사용하고 ANSI 또는 유니 코드입니까? ANSI라면 이것이 불가능합니다. 라이브러리에서 LPCWSTR 유니 코드 문자열을 사용하고 있기 때문에 Unicode 버전의 InnoSetup을 사용해야하며 ANSI 버전의 InnoSetup을 사용하는 경우 문자열이 ANSI 문자열에 매핑되고 유니 코드 문자열 유형이 없습니다. – TLama

+0

나는 Ansi 문자열을 유니 코드로 변환하기 위해 StringHelper를 구현했다. 이 방법은 효과가 없습니까? – user861491

+0

죄송합니다. 내 잘못입니다. 함수는 ANSI 문자열을 매개 변수로 가지며 ('str'은 ANSI 문자열 임) 유니 코드 InnoSetup을 가지고 있습니까? 그렇다면 InnoSetup 함수 import에서 매개 변수를'PName : AnsiString'으로 바꾸면됩니다. – TLama

답변

2

문자열의 길이입니다. 문자열 유형에 대한 포인터를 사용해야 작동합니다. 그래서 유니 코드 InnoSetup을 사용할 때 라이브러리 함수 매개 변수를 유니 코드 문자열 포인터 유형으로 변경하여 다음과 같이하십시오. 그렇다면 InnoSetup 스크립트를 다음과 같이 유지할 수 있습니다 :

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

사실,'string'을 매개 변수로 사용하는 것은'std :: string' 일 것입니다. 이것은 단순한 문자 시퀀스 이상이고 혼합 언어 DLL 함수 매개 변수와 완전히 호환되지 않습니다. (그리고 부수적으로, 어쨌든, 여러분의 라이브러리 내에서도'string'을 값으로 전달하려고해서는 안됩니다.) – Miral