to kiboisme(蓝色光芒):
var
Obj : TCOMOBJ_Test;
P1 : Pointer;
begin
//OBJ := TCOMOBJ_Test.Create;//这样直接创建要出错。^_^
P1 := @OBJ.OnEvent; // *** 估计这里跟 P1 := @TCOMOBJ_Test.OnEvent; 是一样的
if P1 = NIL then exit;
end;
另……问题已经解决,我已经可以把hwnd转换成相应的IWebBrowser2,代码如下:
function GetIEFromHWND(WHandle: HWND; var IE: IWebbrowser2): HRESULT;
var
hInst: HWND;
lRes: Cardinal;
MSG: Integer;
pDoc: IHTMLDocument2;
ObjectFromLresult: TObjectFromLresult;
begin
Result := S_FALSE;
hInst := LoadLibrary('Oleacc.dll');
if hInst <> 0 then
begin
@ObjectFromLresult := GetProcAddress(hInst, 'ObjectFromLresult');
if @ObjectFromLresult <> nil then
begin
try
MSG := RegisterWindowMessage('WM_HTML_GETOBJECT');
SendMessageTimeOut(WHandle, MSG, 0, 0, SMTO_ABORTIFHUNG, 50, lRes); // 这里用50ms会不会太短了?我程序好像有点慢,所以我改为这个值,一帮用1000ms
Result := ObjectFromLresult(lRes, IHTMLDocument2, 0, pDoc);
if Result = S_OK then
begin
(pDoc.parentWindow as IServiceprovider).QueryService(IWebbrowserApp, IWebbrowser2, IE);
end;
finally
// do nothing
end;
end;
FreeLibrary(hInst);
end;
end;
function GetIEFromWBHWND(hwndWB: HWND; var IE: IWebbrowser2): HRESULT;
var
WndChild: Integer;
begin
Result := S_FALSE;
// walk Shell DocObject View->Internet Explorer_Server
WndChild := FindWindowEX(hwndWB, 0, 'Shell DocObject View', nil);
if WndChild <> 0 then
begin
WndChild := FindWindowEX(WndChild, 0, 'Internet Explorer_Server', nil);
if WndChild <> 0 then
Result := GetIEFromHWND(WndChild, IE); // Get Iwebbrowser2 from Handle
end;
end;