2012-02-03 98 views
1

晚上好!fOpen參數無法正常工作

我目前處於Firemonkey的新應用程序開發的第一階段。這是我第一次使用Firemonkey,但是我有幾年的Delphi經驗。

到目前爲止,我有一個外部應用程序從exe中提取圖標,然後將其作爲BMP保存到文件中。我已經編寫了將參數傳遞給此應用程序的能力(它提供了一個字符串值來告訴它從哪裏提取.exe)。它是在VCL中構建的,因爲我想使用主要用於3D功能的firemonkey框架,但是如果我願意的話,還可以讓我在將來的日期擴展到Mac上。外部應用程序正常工作,所以代碼不需要調整。

我遇到的問題是從我的firemonkey應用程序傳遞參數。我正在使用定製的「fOpen」單元,它允許傳遞參數;

unit fOpen; 

interface 

uses 
{$IFDEF MSWINDOWS} 
Winapi.ShellAPI, Winapi.Windows; 
{$ENDIF MSWINDOWS} 
{$IFDEF POSIX} 
    Posix.Stdlib; 
{$ENDIF POSIX} 

type 
    TMisc = class 
class procedure Open(sCommand, Params: string); 
end; 
implementation 

class procedure TMisc.Open(sCommand, Params: string); 
begin 
{$IFDEF MSWINDOWS} 
    ShellExecute(0, 'OPEN', PChar(sCommand), PChar(Params), '', SW_SHOWNORMAL); 
{$ENDIF MSWINDOWS} 
{$IFDEF POSIX} 
    _system(PAnsiChar('open ' + AnsiString(sCommand))); 
{$ENDIF POSIX} 
end; 
end. 

正如你所看到的,我ISDEF添加了 「PARAMS」 變量的MSWINDOWS。

在我的firemonkey窗體上,有2個按鈕。其中1個執行TOpenDialog,並將選定的文件名輸出到TEdit中。另一個按鈕執行外部應用程序(提取圖標的應用程序),然後將保存的位圖圖像加載到TImageControl中。

這是我正在嘗試使用的代碼;

fOpen.TMisc.Open('HypExIcon.exe', '"' + edit1.Text +'"');

的問題是,第一線,應與參數執行該文件,實際上並沒有像預期的那樣。它甚至不會執行文件(即沒有應用程序啓動的跡象,因爲它應該存在)。但是,如果我將其更改爲這個...

fOpen.TMisc.Open('HypExIcon.exe', 'C:\Windows\Notepad.exe');

...它的功能正如所預料的,在執行外部應用程序並創建包含在參數字段中的圖標。我試過使用PChar('"' + Edit1.text + '"')以及類似的PWideChar函數,但他們都沒有解決這個問題。

我相信這是一件非常簡單的事情,我很想念這裏。我很習慣於在VCL中使用PCharPWideChar來處理這些事情,它會把我拋棄。

任何想法?

+0

由於您在Windows上運行並調用ShellExecute,因此Firemonkey在這裏看起來並不相關。對?你把完全合格的路徑放到'Edit1.Text'中嗎?對我來說唯一有意義的是,在Edit1.Text中你沒有完整的文件路徑。我敢打賭,如果你在編輯控件中輸入'C:\ Windows \ Notepad.exe',它就可以工作。 – 2012-02-03 20:16:23

+0

@DavidHeffernan這很奇怪。現在我輸入並繞過「瀏覽」按鈕和TOpenDialog,它工作正常。 – 2012-02-03 20:23:24

+2

當您使用文件對話框瀏覽時,工作目錄會發生變化(除非您禁用該功能)。我認爲。也許這就是發生的事情。您的提取程序對當前目錄敏感嗎?你可以在調用ShellExecute的工作目錄參數中傳遞'ExtractFilePath(Application.ExeName)'。如果你沒有使用文件對話框,這將強制新進程的工作目錄。我認爲。無論如何,答案就在那裏! – 2012-02-03 20:29:40

回答

2

正如我們在評論中提出的那樣,問題在於文件對話框正在改變背後的工作目錄。您可以並應該設置ofNoChangeDir選項。

但是,我建議您在啓動進程時不要依賴相對路徑。在啓動流程時,您應該嚴格控制流程的位置。我會這樣做:

AppPath := ExtractFilePath(Application.ExeName); 
fOpen.TMisc.Open(AppPath+'HypExIcon.exe', ...