Unit testing 安装单个单元类型的组件
我的问题是如何在我们的项目中使用如下单元组件。 我安装了以下组件,但我不能再使用它了。 我所做的所有事情是:1-创建一个包2-将单元添加到包3-右键单击其调色板中的包名,我选择build,然后在下一步中安装4-下一步,我转到component菜单,选择install component,然后在下一页中选择unit和exist package,我添加包名并单击finish。 听起来,所有的事情都很好,但我不能称之为,它不会出现在安装后的工具托盘 基本上,我总是在安装和使用这样的组件时遇到问题Unit testing 安装单个单元类型的组件,unit-testing,delphi,installation,Unit Testing,Delphi,Installation,我的问题是如何在我们的项目中使用如下单元组件。 我安装了以下组件,但我不能再使用它了。 我所做的所有事情是:1-创建一个包2-将单元添加到包3-右键单击其调色板中的包名,我选择build,然后在下一步中安装4-下一步,我转到component菜单,选择install component,然后在下一页中选择unit和exist package,我添加包名并单击finish。 听起来,所有的事情都很好,但我不能称之为,它不会出现在安装后的工具托盘 基本上,我总是在安装和使用这样的组件时遇到问题 u
unit U_Usb;
interface
uses
Windows, Messages, SysUtils, Classes, Forms;
type
PDevBroadcastHdr = ^DEV_BROADCAST_HDR;
DEV_BROADCAST_HDR = packed record
dbch_size: DWORD;
dbch_devicetype: DWORD;
dbch_reserved: DWORD;
end;
PDevBroadcastDeviceInterface = ^DEV_BROADCAST_DEVICEINTERFACE;
DEV_BROADCAST_DEVICEINTERFACE = record
dbcc_size: DWORD;
dbcc_devicetype: DWORD;
dbcc_reserved: DWORD;
dbcc_classguid: TGUID;
dbcc_name: short;
end;
const
GUID_DEVINTERFACE_USB_DEVICE: TGUID = '{A5DCBF10-6530-11D2-901F-00C04FB951ED}';
DBT_DEVICEARRIVAL = $8000; // system detected a new device
DBT_DEVICEREMOVECOMPLETE = $8004; // device is gone
DBT_DEVTYP_DEVICEINTERFACE = $00000005; // device interface class
type
TComponentUSB = class(TComponent)
private
FWindowHandle: HWND;
FOnUSBArrival: TNotifyEvent;
FOnUSBRemove: TNotifyEvent;
procedure WndProc(var Msg: TMessage);
function USBRegister: Boolean;
protected
procedure WMDeviceChange(var Msg: TMessage); dynamic;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property OnUSBArrival: TNotifyEvent read FOnUSBArrival write FOnUSBArrival;
property OnUSBRemove: TNotifyEvent read FOnUSBRemove write FOnUSBRemove;
end;
implementation
constructor TComponentUSB.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FWindowHandle := AllocateHWnd(WndProc);
USBRegister;
end;
destructor TComponentUSB.Destroy;
begin
DeallocateHWnd(FWindowHandle);
inherited Destroy;
end;
procedure TComponentUSB.WndProc(var Msg: TMessage);
begin
if (Msg.Msg = WM_DEVICECHANGE) then
begin
try
WMDeviceChange(Msg);
except
Application.HandleException(Self);
end;
end
else
Msg.Result := DefWindowProc(FWindowHandle, Msg.Msg, Msg.wParam, Msg.lParam);
end;
procedure TComponentUSB.WMDeviceChange(var Msg: TMessage);
var
devType: Integer;
Datos: PDevBroadcastHdr;
begin
if (Msg.wParam = DBT_DEVICEARRIVAL) or (Msg.wParam = DBT_DEVICEREMOVECOMPLETE) then
begin
Datos := PDevBroadcastHdr(Msg.lParam);
devType := Datos^.dbch_devicetype;
if devType = DBT_DEVTYP_DEVICEINTERFACE then
begin // USB Device
if Msg.wParam = DBT_DEVICEARRIVAL then
begin
if Assigned(FOnUSBArrival) then
FOnUSBArrival(Self);
end
else
begin
if Assigned(FOnUSBRemove) then
FOnUSBRemove(Self);
end;
end;
end;
end;
function TComponentUSB.USBRegister: Boolean;
var
dbi: DEV_BROADCAST_DEVICEINTERFACE;
Size: Integer;
r: Pointer;
begin
Result := False;
Size := SizeOf(DEV_BROADCAST_DEVICEINTERFACE);
ZeroMemory(@dbi, Size);
dbi.dbcc_size := Size;
dbi.dbcc_devicetype := DBT_DEVTYP_DEVICEINTERFACE;
dbi.dbcc_reserved := 0;
dbi.dbcc_classguid := GUID_DEVINTERFACE_USB_DEVICE;
dbi.dbcc_name := 0;
r := RegisterDeviceNotification(FWindowHandle, @dbi,
DEVICE_NOTIFY_WINDOW_HANDLE
);
if Assigned(r) then Result := True;
end;
end.
您的装置没有
寄存器
程序。这是能够将组件安装到IDE中的要求
安装软件包时,在接口中找到寄存器
过程的任何单元在“安装”软件包时都将调用此寄存器
过程。在其中,然后调用将组件实际安装到IDE中
它应该是这样的:
...
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('My Components', [TComponentUSB]);
end;
...
请记住,寄存器
过程不一定需要在同一个单元中。具有多个组件的包的正常设计是在设计时包中有一个单元,该单元只有寄存器
程序。具有实际组件的其余单元可能是设计时包所需的单独运行时包的一部分
此外,在一个单元中可以有许多组件。只有对注册表组件的调用中的组件才会安装到IDE中
别忘了在IDE的库路径中也包含此单元的位置 我看不到您的注册过程。这是发布组件的要求。FWIW,安装组件与单元级别无关。在一个单元中可以有10个组件。但是您需要一个Register
过程来调用RegisterComponents
来实际告诉IDE您希望它做什么。否则,你所做的就是编译代码。我不熟悉你想要我做的事情。我必须添加什么程序以及在哪里分配?@M.MARAMI:如果这是现有组件的代码,我假设有第二个单元用于注册您的组件。它应该有一个注册程序。是这样吗?如果没有,你为什么在这里问问题而不是阅读文档?@David Heffernan:对不起。我知道这对你们来说很简单,但相信我,我甚至不知道必须注册一个单位,而不是我研究它。