就是一个网站,里面有资料,不过要登录,并且要经过几个链接才能打开。我用 WebBrowser控件,并在DocumentCompleted事件里保存状态,结果多次调用DocumentCompleted才能打开该页面,并得到数据。现在我想把这个功能封装到DLL类库里,没有思路了,好像这样就异步调用了,如何得到数据呢?

解决方案 »

  1.   

    换个问法,WebBrowser控件能不能在dll库中使用?不用 WebRequest 相关类是因为网址动态,而且跳转复杂。
      

  2.   

    { IPersistStream interface }{$EXTERNALSYM IPersistStream}IPersistStream = interface(IPersist)[´{00000109-0000-0000-C000-000000000046}´]function IsDirty: HResult; stdcall;// 最后一次存盘后是否被修改function Load(const stm: IStream): HResult; stdcall;// 从流中载入function Save(const stm: IStream;fClearDirty: BOOL): HResult; stdcall;// 保存到流function GetSizeMax(out cbSize: Largeint):HResult; stdcall; // 取得保存所需空间大小end;{ IPersistStreamInit interface }{$EXTERNALSYM IPersistStreamInit}IPersistStreamInit = interface(IPersistStream)[´{7FD52380-4E07-101B-AE2D-08002B2EC713}´]function InitNew: HResult; stdcall; // 初始化end;首先来实现写,因为这是最迫切的要求:procedure SetHtml(const WebBrowser:TWebBrowser; const Html: string);varStream: IStream;hHTMLText: HGLOBAL;psi: IPersistStreamInit;beginif not Assigned(WebBrowser.Document) then Exit;hHTMLText := GlobalAlloc(GPTR, Length(Html) + 1);if 0 = hHTMLText then RaiseLastWin32Error;CopyMemory(Pointer(hHTMLText),PChar(Html), Length(Html));OleCheck(CreateStreamOnHGlobal(hHTMLText, True, Stream));tryOleCheck(WebBrowser.Document.QueryInterface(IPersistStreamInit, psi));tryOleCheck(psi.InitNew);OleCheck(psi.Load(Stream));finallypsi := nil;end;finallyStream := nil;end;end;