カスタムコンポーネントの作成者の中には、シェアウェアの制限を設定するためにDelphiが実行されているかどうかを確認するRTLルーチンを使用していると聞いてきました。誰でもこのルーチンが何であるか知っていますか? "DelphiRunning"や "IsDelphiRunning"のような明白な名前を確認しても何も役に立たない。私のプログラムはDelphiが動作しているかどうかをどのように伝えることができますか?
答えて
ここ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はコード内で手動で設定できます
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;
ホラーをコピーアンドペーストします。このコードスニペットはクリーンアップするか忘れてください。本当に。 –
コンポーネントコードからDebugHook <> 0を使用することができます。 DebugHookは、Delphi/RAD Studio IDEによって設定されたグローバル変数(IIRC、システムユニットにあります)で、どこからでも設定することはできませんでした。
他の手法(たとえば、TAppBuilderのFindWindow())がありますが、DebugHookはその中からすべての作業を行います。
DebugHookはIDE内でF9が押された場合にのみtrueを返します。 IDE内でCtrl + Shift + F9が押された場合はtrueを返しません。 –
@ MichaelRiley-AKAGunny:もちろんそうです。 Ctrl + Shift + F9はDebuggingなしで**実行されます.DebugHookは設定されません。しかし、デバッガの制御下で実行していない場合は、IDEで実行していないのでしょうか? –
- 1. 親フォームは、非モーダルフォームがまだ開いているかどうかをどのように伝えることができますか?
- 2. どのようにlog4jにプロパティファイルがあるのかを伝えることができますか?
- 3. 誰かがこのMSテキストが伝えようとしていることを説明できますか?
- 4. LinuxがPAEモードまたは非PAEモードであることをプログラムでどのように伝えるか?
- 5. シェルスクリプトは、256色サポートのxtermウィンドウで実行されているかどうかをどのように伝えることができますか?
- 6. 私のgitブランチが変更されたEmacsにどうやって伝えることができますか?
- 7. ユーザーがスクリーンショットを作成したかどうかはどのように知ることができますか?
- 8. どのように私はdeleteRowsAtIndexPathsを作ることができます:GenericTableViewControllerで動作しますか?
- 9. ブログページの場合は、ヘッダー内の何かを行うように私のワードプレスにどのように伝えることができますか?
- 10. どのメニューアイテムがDelphiで開いているかをどのように教えていますか?
- 11. Oracleデータベース用にプログラムで作成したDSNの場合どのようにして確実にドライバ名を伝えることができますか?
- 12. スクリプトはどのように動作させることができますか?
- 13. ストリームが閉じているかどうかをどのように知ることができますか?
- 14. 私はどのように私の戻るボタンfunctionallytyをプログラムで使用することができますか?
- 15. 完了したらインタラクティブモードに入るようにCPythonインタプリタにプログラムでどのように伝えることができますか?
- 16. どのようにしてこのjqueryを動作させることができますか?ここ
- 17. PHPスクリプトは、サーバーがビジー状態かどうかをどのように伝えることができますか?
- 18. ビジュアルスタジオはC++とCにどのように伝えますか?
- 19. GPSの形が交差するかどうかをC#でどのように伝えるか?
- 20. 私自身のカスタム動的スキャフォールディングメソッドをどのように置き換えることができますか
- 21. オブジェクトファイルが-fPICで構築されている場合、objdumpのようなものでどのように伝えることができますか?
- 22. オートプレフィクサーが動作しているかどうかをテストするにはどうすればよいですか?
- 23. ブラウザはユーザーのクリックとプログラムによるクリックの違いをどのように伝えますか?
- 24. 私はどのようにしてビューを継続的に動かすことができますか?
- 25. ピンチとズームの動作の速度はどのようにして決めることができますか?
- 26. 私の活動にどのようにカール効果を与えることができますか?
- 27. 私のアプリケーションがIDE "Delphi 2007 .Net"で動作しているかどうかを検出する
- 28. TableViewが空であるかどうかはどのように知ることができますか?
- 29. マウスがウィジェット上にあるかどうかはどのように知ることができますか?
- 30. 行がないときにこれをどのように数えることができますか?
+1、しかし、 'DebugHookはコード内に手動で設定することができますか?'という短所の両方で、何らかの回避策がありますか? – PresleyDias
@PresleyDias、そして、あなたはcatとmouseの再生を開始します。ただし、覚えておくべきことは、手動でDebugHookを設定すると、アプリケーションが 'DebugBreak'または' asm int 3 end'に遭遇し、 ... –
オハイオ州オクラホマ:P ...オクラホマ、アプリケーションがクラッシュした場合は、それはいいです – PresleyDias