读书人

跨进程操作TDBNavigator?解决方法

发布时间: 2012-04-11 17:42:33 作者: rapoo

跨进程,操作TDBNavigator?
library dll;

uses
Windows,
StrUtils,
Messages,
SysUtils,
Variants,
Classes,
Graphics,
Controls,
Forms,
Dialogs,
StdCtrls,
ADODB,
DB,
DBCtrls,
ExtCtrls,
ActiveX;


{$R *.res}

var
ControlAtom: TAtom;
ControlAtomString: string;
RM_GetObjectInstance: DWORD; // registered window message

DBNavigatorE: TDBNavigator;


function FindControl(Handle: HWnd): TWinControl;
var
OwningProcess: DWORD;
begin
Result := nil;
if (Handle <> 0) and (GetWindowThreadProcessID(Handle, OwningProcess) <> 0) and
(OwningProcess = GetCurrentProcessId) then
begin
if GlobalFindAtom(PChar(ControlAtomString)) = ControlAtom then
Result := Pointer(GetProp(Handle, MakeIntAtom(ControlAtom)))
else
Result := Pointer(SendMessage(Handle, RM_GetObjectInstance, 0, 0));
end;
end;

begin
ControlAtomString := Format('ControlOfs%.8X%.8X', [GetModuleHandle(nil), GetCurrentThreadID]);
ControlAtom := GlobalAddAtom(PChar(ControlAtomString));
RM_GetObjectInstance := RegisterWindowMessage(PChar(ControlAtomString));

DBNavigatorE:= TDBNavigator(FindControl(722830));
DBNavigatorE.BtnClick(int(nbInsert));//这老是不触发事件,出错。实例我已经能抓到

GlobalDeleteAtom(ControlAtom);
ControlAtomString := '';
end.


[解决办法]
晕倒!!设计不对。换一个解决方案吧

读书人网 >.NET

热点推荐