デバッグ時に CreateProcess() や ShellExecute() でおかしくなる。 (Unicode 版 Delphi)

 CreateProcess() の第 2 引数や、ShellExecute() の第 3 引数に渡す String 型変数を UniqueString() に渡してみてください。

// CreateProcess の例

var
  sCmdLine: String;
begin
  sCmdLine := 'notepad.exe';
  UniqueString(sCmdLine);      // <-------- Add
  CreateProcess(nil, PChar(sCmdLine), 
end;


// ShellExecute の例

var
  MailAddress : string;
begin
  MailAddress := 'mailto:hoge@hoge.com';
  UniqueString(MailAddress);  // <-------- Add
  ShellExecute(Handle, 'OPEN', PChar(MailAddress) ,'''', SW_SHOWNORMAL);
end;

See Also:


外部デバッガでアプリケーションをデバッグされたくない (アンチデバッガの初歩)

 改ざん防止策ですね。初歩の初歩は以下のようなコードの埋め込みです。

  if IsDebuggerPresent then
    Application.Terminate;

 デバッガから起動されると、アプリケーションを終了するコードです。このままだと、Delphi の IDE から起動しても終了してしまいますので、ちょっと改良します。

  {$IFNDEF DEBUG}
  if IsDebuggerPresent then
    Application.Terminate;
  {$ENDIF}

 このようにすれば、デバッグモードの時はデバッガを検知しません。でも、この手法はデバッガからアプリケーションが起動された時にのみ有効で、アプリケーションを起動した後にデバッガからアタッチされた場合には意味がありません。

 "デバッグされているアプリケーションはデバッグできない" ので、"自身をデバッグプロセスで起動する" というのが次の手になります。まぁ、ハックするヒトはどんな手を使ってでもハックしちゃいますので、そこそこの手段を採っていればいいかと思います...あまり神経質にならず、バカ除け程度の実装で充分じゃないでしょうか。


DBX で Blackfish SQL に接続するには?

 コードは難しくないんですよね、コードは。

uses
  ..., DbxBlackfishSQL;

procedure TForm1.Button1Click(Sender: TObject);
var
  CTX: TDBXContext;
  PROP: TDBXBlackfishSQLProperties;
  DBXC: TSQLConnection;
  QRY: TSQLQuery;
  Dmy: String;
begin
  DBXC := TSQLConnection.Create(Self);
  QRY := TSQLQuery.Create(Self);
  try
    DBXC.LoginPrompt := False;
    DBXC.DriverName  := 'BLACKFISHSQL';
    CTX := TDBXContext.Create;
    PROP := TDBXBlackfishSQLProperties.Create(CTX);
    try
      DBXC.Params.Clear;
      DBXC.Params.Values['DriverUnit'           ] := PROP.Values['DriverUnit'];
      Dmy := StringReplace(PROP.Values['MetaDataPackageLoader'],
                           'TDBXDataStoreMetaDataCommandFactory',
                           'TDBXClientDriverLoader',
                           [rfIgnoreCase]);
      DBXC.Params.Values['DriverPackageLoader'  ] := Dmy;
      DBXC.Params.Values['MetaDataPackageLoader'] := PROP.Values['MetaDataPackageLoader'];
      DBXC.Params.Values['User_Name'            ] := PROP.UserName; // User Name
//    DBXC.Params.Values['User_Name'            ] := 'sysdba';      // User Name
      DBXC.Params.Values['Password'             ] := PROP.PassWord; // Password
//    DBXC.Params.Values['Password'             ] := 'masterkey';   // Password
      Dmy := IncludeTrailingPathDelimiter(ExtractFilePath(ParamStr(0))) +
             'DATA\DATA.JDS';
      DBXC.Params.Values['DataBase'             ] := Dmy;           // Database
    finally
      PROP.Free;
      CTX.Free;
    end;
    QRY.SQLConnection := DBXC;
    DBXC.Connected := True;
    QRY.SQL.Clear;
    QRY.SQL.Add('Select * From MST_EMPLOYEE');
    QRY.Open;
    Memo1.Lines.Clear;
    while not QRY.EOF do
      begin
        Dmy := QRY.FieldByName('NAME').AsString;
        Memo1.Lines.Add(Dmy);
        QRY.Next;
      end;
    QRY.Close;
    DBXC.Connected := False;
  finally
    QRY.Free;
    DBXC.Free;
  end;
end;

 パラメータ設定付近の気持ち悪いコードは配布時の手間をなくすためのものです。サンプルコードのように記述しておくと、Delphi (パッケージ) のバージョンに依存しないソースコードにできます。

See Also:


 BACK