2012-11-16 4 views
-1

Delphi 2006을 사용하여 컴파일 된 애플리케이션이 있으며 XE2에서 컴파일 된 다른 애플리케이션을 시작하고 매개 변수를 전달하려고합니다. ShellExecute를 사용하여 D2006에서 두 번째 응용 프로그램을 시작하고 ShellExecute의 네 번째 매개 변수는 PANSIChar (시작된 응용 프로그램에 전달 된 매개 변수로)를 필요로합니다.Delphi 2006 앱에서 XE2 앱에 PANSIChar 매개 변수 전달

내 XE2 앱이 UNICODE 문자열을 변경했기 때문에 매개 변수를 올바르게 읽지 않습니다.

내 D2006 응용 프로그램에서 내 XE2 응용 프로그램을 시작하고 해당 문자열을 매개 변수로 전달할 수있는 방법이 있습니까?

+0

"매개 변수를 올바르게 읽지 않음"이라고 말하면 정확히 무엇을 의미합니까? 나는 그것이 "잘못된 가치를 얻고있다"는 것을 의미한다고 생각할 것이다. 이 경우 D2006 앱에서 정확히 무엇을 보내고 있으며 XE2 앱은 정확히 무엇을 수신합니까? –

답변

4

Delphi 2006 프로그램이 ANSI 버전의 ShellExecute, 즉 ShellExecuteA를 호출합니다. 그것은 ANSI 매개 변수를받습니다.

이러한 인수가 Delphi XE2 프로그램에 도착하면 GetCommandLine을 통해 인수가 검색됩니다. 그리고 XE2 프로그램은 유니 코드 버전 인 GetCommandLineW를 호출합니다.

그러나 장면 뒤에 Windows는 ANSI에서 유니 코드로 변환 될 것입니다.

이러한 종류의 상황에 맞는 변환은 Windows에서 항상 발생합니다. 예를 들어, WM_SETTEXT의 경우 SendMessageA를 호출하고 PAnsiChar를 전달합니다. 그러나 창은 유니 코드 창이므로 PWideChar를받습니다. 시스템은 이런 방식이어야합니다. 다른 것은 무정부 상태입니다.

문제의 원인은 ANSI와 다른 유니 코드를 사용하는 프로그램이 아닙니다. 너의 문제는 다른 곳에있다.

정확하게이 정보로 말할 수는 없습니다. 한 가지 확실한 가능성은 인수에 공백이 포함되어 있다는 것입니다. 이러한 공백은 수신자 인 XE2 프로그램에 의해 인수 분리 자로 해석됩니다. 인수를 따옴표로 묶으십시오. 이와 같이 :

ShellExecute(..., '"argument with spaces"', ...); 

또 다른 가능성은 수신 할 때 PAnsiChar에 인수를 전달하고 있다는 것입니다. 그렇다면 그렇게하지 마십시오. 유니 코드 문자열 인 ParamStr (1)을 읽으십시오. Windows에서 ANSI로 변환되었습니다.

분명히 여기에 약간의 추측을하고 있지만 결함을 확실하게 진단하기에는 정보가 충분하지 않습니다. 그러나 시나리오에서 ANSI 텍스트가 투명하게 유니 코드로 변환되었는지 확인할 수 있습니다.