3

Windows に含まれている SysMon.ocx ActiveX コントロールを使用して、パフォーマンス モニターのような機能を作成する非常に魅力的なサンプルを見つけました。

いくつかのパフォーマンス カウンター (この場合は SQL サーバーのパフォーマンス用) を動的に追加した HTML ページ内で使用するサンプルを見つけました。Delphi は実行時に簡単に ActiveX/OLE オブジェクトを作成できるので、ここにある HTML サンプルを Delphiに変換してみようと思いました。最初のステップは、タイプ ライブラリをSystemMonitor_TLB.pasインポートし、Delphi 2007 を使用して通常のインポート方法で作成した を作成することです。

OCX を登録し、タイプ ライブラリ インポーターを使用して「システム モニター」OCX (SysMon.ocx) をインポートしました。これにより、次のようなインポート TLB.pas ファイルが作成されました。(ファイルの代表的なサンプルのみをここに示します)。

unit SystemMonitor_TLB;

// ************************************************************************ //
// WARNING                                                                    
// -------                                                                    
// ...
// Type Lib: C:\Windows\system32\sysmon.ocx (1)
// LIBID: {1B773E42-2509-11CF-942F-008029004347}
// LCID: 0
// Helpfile: 
// HelpString: System Monitor Control
// DepndLst: 
//   (1) v2.0 stdole, (C:\Windows\system32\stdole2.tlb)
// Errors:
//   Hint: TypeInfo 'SystemMonitor' changed to 'SystemMonitor_'
//   Error creating palette bitmap of (TSystemMonitor_) 
// : Registry key CLSID\{C4D2D8E0-D1DD-11CE-940F-008029004347}\ToolboxBitmap32 not found
// ************************************************************************ //
// *************************************************************************//

{$TYPEDADDRESS OFF} // Unit must be compiled without type-checked pointers. 
{$WARN SYMBOL_PLATFORM OFF}
{$WRITEABLECONST ON}
{$VARPROPSETTER ON}
interface

uses Windows, ActiveX, Classes, Graphics, OleCtrls, OleServer, StdVCL, Variants;



// *********************************************************************//
// GUIDS declared in the TypeLibrary. Following prefixes are used:        
//   Type Libraries     : LIBID_xxxx                                      
//   CoClasses          : CLASS_xxxx                                      
//   DISPInterfaces     : DIID_xxxx                                       
//   Non-DISP interfaces: IID_xxxx                                        
// *********************************************************************//
const
  // TypeLibrary Major and minor versions
  SystemMonitorMajorVersion = 3;
  SystemMonitorMinorVersion = 7;

  LIBID_SystemMonitor: TGUID = '{1B773E42-2509-11CF-942F-008029004347}';
  IID_...  // about 20 more lines of GUIDs s
// --SNIP--
// about 5000  lines of pretty typical import-TLB-code snipped
// --SNIP--
procedure Register;
begin
  RegisterComponents(dtlOcxPage, [TSystemMonitor_, TCounterItem, TLogFileItem]);
  RegisterComponents(dtlServerPage, [TCounters, TLogFiles, TCounterItem2, TSystemMonitor2, 
    TAppearPropPage, TGeneralPropPage, TGraphPropPage, TSourcePropPage, TCounterPropPage]);
end;

end.

上記のファイル全体は、ここで要点として見つけることができます。

このユニットを含むパッケージ .dpk をインストールし、デモ フォームを作成しました。ActiveX コントロールは、少なくとも設計時には機能しているようです。デモ アプリを実行すると、フォームにコンポーネントを追加した場合のみ、デザインタイムに、基本クラスのインスタンス化の途中にあるように見える時点で、実行時に例外が発生しますTOleControl

procedure TOleControl.CreateControl;
var
  Stream: IStream;
  CS: IOleClientSite;
  X: Integer;
begin
   //  about 12 lines not shown.
   OleCheck(FPersistStream.Load(Stream)); // here's where we get the mystery OLE error.
   DestroyStorage;
   // more code here.
end;

私が知りたいのは:

  1. 謎の OLE エラーは何を意味するのでしょうか? また、修正方法を知っている人はいますか?

  2. または、上記を回避する方法、または Delphi 2007 または xe2 で動作する PerfMon の sysmon.ocx の (設計時および実行時の) バージョンを取得する方法を知っている人はいますか?

  3. コメントのヒントは、この問題を解決するための何らかの鍵です:

     //   Hint: TypeInfo 'SystemMonitor' changed to 'SystemMonitor_'
    

更新: 設計時のサポートの回避策について話していることに注意してください。デザインタイムではなく、実行時にのみコントロールを作成すると、うまく機能します。

type
  TSystemMonitor = TSystemMonitor_;
...
procedure TForm1.FormCreate(Sender: TObject);
begin
 SysMonCtrl := TSystemMonitor.Create(Self);
 SysMonCtrl.Align := alClient;
 SysMonCtrl.Parent := Self;
 SysMonCtrl.Show;
end;

たぶん私はそのようにすべきですか?

4

0 に答える 0