IDE/VCLのBugFixが進まないことにAndreas Hausladenさんが業を煮やしたらしく、IDE/VCLの非公式パッチ集であるIDE Fix Pack 2009とVCL Fix Packをリリースしています。
IDE Fix Pack 2.0 and VCL Fix Pack 1.0 released
IDE Fix PackにはDelphi/C++Builder 2007用もあります。またVCL Fix PackはDelphi 6以降に適用可能なようです(先日の非公式パッチも含まれています)。
2008年11月21日
3rdRail and TurboRuby
CodeGear(Embarcadero)から3rdRail 2.0とTurboRubyが発表されています。
Press Release: Embarcadero Ships Latest Edition of 3rdRail™ and Introduces TurboRuby IDEs
気になる3rdRail SKUとTurboRuby SKUの違いですが、FAQ FAQによればRailsフレームワークのサポートの有無(TurboRubyはRailsフレームワークをサポートしない)のようです。
ということは。
あくまで個人的な意見ですが、噂のDelphi/C++BuilderのTurbo SKUも、IDEは同じだけれどもVCLというフレームワームをサポートしない、という路線なのでは?と考えています。
2011/05/04追記: codegear.comのリンクをembarcadero.comのものに差し替え。
Press Release: Embarcadero Ships Latest Edition of 3rdRail™ and Introduces TurboRuby IDEs
気になる3rdRail SKUとTurboRuby SKUの違いですが、
ということは。
あくまで個人的な意見ですが、噂のDelphi/C++BuilderのTurbo SKUも、IDEは同じだけれどもVCLというフレームワームをサポートしない、という路線なのでは?と考えています。
2011/05/04追記: codegear.comのリンクをembarcadero.comのものに差し替え。
2008年11月19日
マニフェストのrequestExecutionLevelに指定できる値
Windows Vista上で管理者権限を要求するアプリケーションを作成するで説明したアプリケーションマニフェスト上のrequestExecutionLevelのlevel属性に指定できる値とその意味は以下のようになっています。
元ねたはAdvanced Windows 第5版 上 p.142
2008/11/20追記: ついでにGetProcessElevation関数(p.146)を移植してみようと思ったけど、Windows 2000ではGetTokenInformationにTokenElevationTypeを渡すとパラメータエラーになることが判明して断念。難しい…。
requireAdministrator
- アプリケーションはAdministrator権限で開始されなければならず、それ以外の権限では実行されない。
highestAvailable
- アプリケーションはログオンアカウントで要求できる最も高い権限で開始されなければならない。ログオンユーザがAdministratorアカウントならば権限昇格のプロンプトが表示されたうえでAdministrator権限で開始され、標準ユーザアカウントならば(権限昇格のプロンプトの表示なしに)標準の権限で開始される。
asInvoker
- アプリケーションは呼び出し元のアプリケーションと同じ権限で開始される。
元ねたはAdvanced Windows 第5版 上 p.142
2008/11/20追記: ついでにGetProcessElevation関数(p.146)を移植してみようと思ったけど、Windows 2000ではGetTokenInformationにTokenElevationTypeを渡すとパラメータエラーになることが判明して断念。難しい…。
2008年11月16日
Delphi 2009/C++Builder 2009非公式パッチ群
DelphiSpeedUpやDDevExtensionsで有名なAndreas HausladenさんがDelphi 2009/C++Builder 2009の非公式パッチを4点公開しています。
QC66892 Form.Hide/Close - Stack tashing bugfix unit 元記事
QC59963 Application De/Activate bugfix unit (2007/2009) 元記事
QC68740 TOpen/SaveDialog focus bugfix unit (2007/2009) 元記事
IDE Fix Pack 1.0 for RAD Studio 2009 元記事
QC66892 Form.Hide/Close - Stack tashing bugfix unit 元記事
QC59963 Application De/Activate bugfix unit (2007/2009) 元記事
QC68740 TOpen/SaveDialog focus bugfix unit (2007/2009) 元記事
IDE Fix Pack 1.0 for RAD Studio 2009 元記事
2008年11月13日
アプリケーションの多重起動を禁止する
プログラムの性質によっては多重起動を禁止したいことがあります。このようなときには同期オブジェクトの一つであるmutexを使用します。
Delphiのプロジェクトソースを開くとこのようになっています。
作成するmutexの名前は任意(上記の例では適当にGUIDを生成して使用しています)ですが、'Global\'と'Local\'で始まるmutex名には特別な意味があるので注意が必要です(詳細はCreateMutex参照)。また同名のmutexが存在するかどうかを調べるのにOpenMutexを使用するとOpenMutexの呼び出しからCreateMutexの呼び出しまでの間が無防備になってしまうため、CreateMutexの第2パラメータbInitialOwnerにFalseを指定して呼び出し後、GetLastErrorの値がERROR_ALREADY_EXISTSかどうかで判定するようにします。
さらにアプリケーションのメインウィンドウを前面に移動し、最小化も解除するようにしてみます。
Delphiのプロジェクトソースを開くとこのようになっています。
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
ここで一意な名前のmutexをプログラム実行中だけ作成(CreateMutex)し、もしその名前のmutexが存在していたらプログラムを終了、存在していなければ実行を継続し、プログラム終了時にはmutexを破棄(CloseHandle)するコードを追加します。program Project1;
uses
Windows,
SysUtils,
Forms,
Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
const
{ Mutex name }
CMutexName: String = '{9D0E11F8-ED24-4D3E-91B1-5E9A9BF8673A}';
var
hMutex: THandle;
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
{ Create mutex }
SetLastError(0);
hMutex := CreateMutex(nil,False,PChar(CMutexName));
if hMutex = 0 then
begin
RaiseLastOSError;
end;
try
if GetLastError = ERROR_ALREADY_EXISTS then
begin
Exit;
end;
Application.CreateForm(TForm1, Form1);
Application.Run;
finally
{ Close mutex }
CloseHandle(hMutex);
end;
end.
これでプログラムの多重起動を禁止することができます。作成するmutexの名前は任意(上記の例では適当にGUIDを生成して使用しています)ですが、'Global\'と'Local\'で始まるmutex名には特別な意味があるので注意が必要です(詳細はCreateMutex参照)。また同名のmutexが存在するかどうかを調べるのにOpenMutexを使用するとOpenMutexの呼び出しからCreateMutexの呼び出しまでの間が無防備になってしまうため、CreateMutexの第2パラメータbInitialOwnerにFalseを指定して呼び出し後、GetLastErrorの値がERROR_ALREADY_EXISTSかどうかで判定するようにします。
さらにアプリケーションのメインウィンドウを前面に移動し、最小化も解除するようにしてみます。
program Project1;
uses
Windows,
SysUtils,
Messages,
Forms,
Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
const
{ Mutex name }
CMutexName: String = '{9D0E11F8-ED24-4D3E-91B1-5E9A9BF8673A}';
var
hMutex: THandle;
Wnd: HWnd;
AppWnd: HWnd;
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
{ Create mutex }
SetLastError(0);
hMutex := CreateMutex(nil,False,PChar(CMutexName));
if hMutex = 0 then
begin
RaiseLastOSError;
end;
try
if GetLastError = ERROR_ALREADY_EXISTS then
begin
{ Search main form }
Wnd := FindWindow(PChar('TForm1'),nil); // Class name of the main form
if Wnd = 0 then
begin
Exit;
end;
{ Bring foreground and activate }
SetForegroundWindow(Wnd);
{ Get window handle of TApplication }
AppWnd := GetWindowLong(Wnd,GWL_HWNDPARENT);
if AppWnd <> 0 then
begin
Wnd := AppWnd;
end;
{ Restore if iconized }
if IsIconic(Wnd) then
begin
SendMessage(Wnd,WM_SYSCOMMAND,SC_RESTORE,-1);
end;
Exit;
end;
Application.CreateForm(TForm1, Form1);
Application.Run;
finally
{ Close mutex }
CloseHandle(hMutex);
end;
end.
Delphiのウィンドウコントロールはクラス名がそのままウィンドウクラス名になるため、FindWindowにはアプリケーションのメインフォームのクラス名を渡します。
2008年11月12日
2008年11月11日
Delphi/C++Builder 2009 Japanese Hotfix 1
IDEの環境オプションのタイプライブラリの設定がエラーになる件(QC68044)のHotfixがリリースされています。事前にUpdate 1を適用しておく必要があるとのことです。
Team Japan » Delphi/C++Builder 2009 Japanese Hotfix 1
2008/11/12追記: C++Builder 2009ではdelphicompro120.jpは必要ないとのことです。
Team Japan » Delphi/C++Builder 2009 Japanese Hotfix 1
2008/11/12追記: C++Builder 2009ではdelphicompro120.jpは必要ないとのことです。
2008年11月4日
Delphi 2009/C++Builder 2009 Update 1
Delphi 2009/C++Builder 2009のUpdate 1がリリースされています。
Delphi and C++Builder 2009 Update 1 リリースノート
Delphi 2009 および C++Builder 2009 Update 1 バグフィックスリスト
Delphi and C++Builder 2009 Update 1 リリースノート
Delphi 2009 および C++Builder 2009 Update 1 バグフィックスリスト
登録:
投稿 (Atom)