デバッグ時に 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: