我找到了一个非常诱人的示例,使用Windows附带的SysMon.ocx ActiveX控件创建一个类似于性能的监视器。
我在HTML页面中找到了一个使用它的示例,该页面动态地添加了几个性能计数器(在这种情况下,用于SQL Server性能)。由于Delphi可以在运行时轻松创建ActiveX / OLE对象,我想我会尝试将HTML示例here转换为Delphi。第一步是导入类型库并使用Delphi 2007通过常规导入方式创建SystemMonitor_TLB.pas
。
我已经注册了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.
上面的整个文件可以作为要点here找到。
我安装了包含此单元的包.dpk,并创建了一个演示表单,并且ActiveX控件似乎可以工作,至少在设计时是这样。当我运行我的演示应用程序时,If-and-only-如果我将组件添加到表单中,在设计时,我在运行时获得异常,它似乎是实例化基类{{1}的一部分}:
TOleControl
我想知道的是:
神秘的OLE错误是什么意思,有谁知道我怎么解决它?
或者,是否有人知道如何解决上述问题,或以其他方式获得与delphi 2007或xe2一起使用的PerfMon sysmon.ocx的工作(设计时和运行时)版本?
评论中的提示是否是解决此问题的关键:
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;
更新:请注意,我正在讨论设计时支持的变通方法。当我只在运行时创建控件而不是设计时,它工作正常:
// Hint: TypeInfo 'SystemMonitor' changed to 'SystemMonitor_'
也许我应该这样做?