2009-05-28 10 views
8

カスタムコンポーネントの作成者の中には、シェアウェアの制限を設定するためにDelphiが実行されているかどうかを確認するRTLルーチンを使用していると聞いてきました。誰でもこのルーチンが何であるか知っていますか? "DelphiRunning"や "IsDelphiRunning"のような明白な名前を確認しても何も役に立たない。私のプログラムはDelphiが動作しているかどうかをどのように伝えることができますか?

答えて

18

ここ2さまざまなアイデアあります
- Delphiはアップと
を実行している - アプリケーションは、Delphiはを実行しているかどうかをテストする一般的な方法で確認することで、デバッガ

で実行されているが、 TAppBuilderやTPropertyInspectorのような特定のクラス名を持つ既知のIDE Windowsの存在。
これら2つは、すべてのバージョンのDelphi IIRCで動作します。

、あなたのアプリケーションがデバッガ、すでに実行しているとき、すなわち「ファイル名を指定して実行」(F9)をIDEから正常に立ち上げやデバッガに添付の下で実行されているであるかどうかを知りたい場合は、あなただけのDebugHookグローバルをテストする必要があり変数。
「プログラムからデタッチ」はDebugHook値を削除しませんが、「プロセスにアタッチ」がそれを設定することに注意してください。

function IsDelphiRunning: Boolean; 
begin 
    Result := (FindWindow('TAppBuilder', nil) > 0) and 
    (FindWindow('TPropertyInspector', 'Object Inspector') > 0); 
end; 

function IsOrWasUnderDebugger: Boolean; 
begin 
    Result := DebugHook <> 0; 
end; 

目標は、アプリケーションが開発されているときに、あなたのコンポーネントの試用版の使用を制限にある場合は、両方が欠陥持っている:
- 適切なクラス名/タイトルとの隠されたウィンドウをすることができますアプリケーションに含める
- DebugHookはコード内で手動で設定できます

+0

+1、しかし、 'DebugHookはコード内に手動で設定することができますか?'という短所の両方で、何らかの回避策がありますか? – PresleyDias

+1

@PresleyDias、そして、あなたはcatとmouseの再生を開始します。ただし、覚えておくべきことは、手動でDebugHookを設定すると、アプリケーションが 'DebugBreak'または' asm int 3 end'に遭遇し、 ... –

+0

オハイオ州オクラホマ:P ...オクラホマ、アプリケーションがクラッシュした場合は、それはいいです – PresleyDias

1

www.delphitricks.com/source-code/misc/check_if_delphi_is_running.htmlのコードスニペットです。

function WindowExists(AppWindowName, AppClassName: string): Boolean; 
var 
    hwd: LongWord; 
begin 
    hwd := 0; 
    hwd := FindWindow(PChar(AppWindowName), PChar(AppClassName)); 
    Result := False; 
    if not (Hwd = 0) then {window was found if not nil} 
    Result := True; 
end; 

function DelphiLoaded: Boolean; 
begin 
    DelphiLoaded := False; 
    if WindowExists('TPropertyInspector', 'Object Inspector') then 
    if WindowExists('TMenuBuilder', 'Menu Designer') then 
     if WindowExists('TAppBuilder', '(AnyName)') then 
     if WindowExists('TApplication', 'Delphi') then 
      if WindowExists('TAlignPalette', 'Align') then 
      DelphiLoaded := True; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    if DelphiLoaded then 
    begin 
    ShowMessage('Delphi is running'); 
    end; 
end; 


function DelphiIsRunning: Boolean; 
begin 
    Result := DebugHook <> 0; 
end; 
+2

ホラーをコピーアンドペーストします。このコードスニペットはクリーンアップするか忘れてください。本当に。 –

3

コンポーネントコードからDebugHook <> 0を使用することができます。 DebugHookは、Delphi/RAD Studio IDEによって設定されたグローバル変数(IIRC、システムユニットにあります)で、どこからでも設定することはできませんでした。

他の手法(たとえば、TAppBuilderのFindWindow())がありますが、DebugHookはその中からすべての作業を行います。

+0

DebugHookはIDE内でF9が押された場合にのみtrueを返します。 IDE内でCtrl + Shift + F9が押された場合はtrueを返しません。 –

+1

@ MichaelRiley-AKAGunny:もちろんそうです。 Ctrl + Shift + F9はDebuggingなしで**実行されます.DebugHookは設定されません。しかし、デバッガの制御下で実行していない場合は、IDEで実行していないのでしょうか? –

関連する問題