首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

这段IHTMLDocument2的代码怎么完全释放

2013-08-14 
这段IHTMLDocument2的代码如何完全释放?下面的代码在编译状态下执行后程序退出后编译器仍处于调试状态,就

这段IHTMLDocument2的代码如何完全释放?
下面的代码在编译状态下执行后程序退出后编译器仍处于调试状态,就好像程序没有退出一样,是什么问题?该如何解决?


  HWND TheWindowHandle=FindWindowEx(NULL,NULL,L"IEFrame",NULL);
    if(!TheWindowHandle){ // 如果找不到IE窗口
      Application->BringToFront();
  ShowMessage(L"Internet Explorer浏览器没有启动,操作取消");
      return;
}
  M_QHJI=0; // 入库时已经存在的
  M_RTJF=0; // 入库成功的
  TCppShellWindows *CppShellWindows1 = new TCppShellWindows(NULL);
    try{
  long lCopies=CppShellWindows1->get_Count(); // 此处取得的数量包括网页和资源管理器等
for(long m=0;m<lCopies;m++){
  TVariant va(m);
  IWebBrowser2Ptr browser(CppShellWindows1->Item(va));
if(browser){
  LPDISPATCH   pDisp   =   NULL;
  browser->get_Document(&pDisp);
if(pDisp){
if(
(HWND)(browser->get_HWND())!=TheWindowHandle
){ // 判断是否当前浏览器(注意:当前浏览器是指一个浏览器窗口实例,其中可能包含多个页面的选项卡)
  //如果仅仅操作当前页面的话,启用此处的continue;
  //continue; // 跳过本次循环下面尚未执行的语句,接着执行下次循环
}
  IHTMLDocument2 *pDoc2;
if(
SUCCEEDED(pDisp->QueryInterface(IID_IHTMLDocument2,(void**)&pDoc2))
){ // 此处开始取得浏览器指针,如果不是IE浏览器就会是NULL
  IHTMLElement *pElement = NULL;
  pDoc2->get_body(&pElement);
if(pElement){
  //一个IE进程可能打开多个IE选项卡,
  //目前还没有办法取得当前选项卡,
  //因此在循环中取出所有的。
  //使用时注意

  BSTR BSTRUrl; // 当前浏览器打开的网址
  pDoc2->get_URL(&BSTRUrl);
if(BSTRUrl){
  //Memo1->Lines->Add(BSTRUrl); // 当前浏览器打开的网址
  G_ZVET[C_TMFY].J_WGQJ=BSTRUrl; // 当前浏览器打开的网址
}else{
  G_ZVET[C_TMFY].J_WGQJ=L""; // 当前浏览器打开的网址
                            }
  SysFreeString(BSTRUrl);

  BSTR BSTRTitle; // 当前页面标题
  pDoc2->get_title(&BSTRTitle);
if(BSTRTitle){
  //Memo1->Lines->Add(BSTRTitle); // 当前页面标题
  G_ZVET[C_TMFY].J_CKDA=BSTRTitle; // IE窗口的标题
}else{
  G_ZVET[C_TMFY].J_CKDA=L""; // IE窗口的标题
                            }


  SysFreeString(BSTRTitle);

  BSTR BSTRTxt; // 当前页面纯文本
  pElement->get_innerText(&BSTRTxt); // 当前页面纯文本
if(BSTRTxt){
  //Memo1->Lines->Add(BSTRTxt); // 当前页面纯文本
  G_ZVET[C_TMFY].J_DHZE=BSTRTxt; // 当前页面纯文本
}else{
  G_ZVET[C_TMFY].J_DHZE=L""; // 当前页面纯文本
                            }
  SysFreeString(BSTRTxt);
}
//if(pElement){
  pElement->Release();
//}
}
//if(pDoc2){
  //pDoc2->Release(); // 这里会出错
//}
}
}
}
}__finally{
if(CppShellWindows1!=NULL){
  //delete CppShellWindows1;
}
}
delete CppShellWindows1;
CppShellWindows1=NULL;


[解决办法]
和C++Builder的源码有啥关系?
[解决办法]
是哪个pas文件,delphi中有没有,能找到的话,把pas文件加到c++builder工程里编译是可以解决问题的
[解决办法]
我试了,没问题呢,代码是:


unit3.h

//---------------------------------------

#ifndef Unit3H
#define Unit3H
//---------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <Vcl.OleCtrls.hpp>
#include "SHDocVw_OCX.h"
//---------------------------------------
class TForm3 : public TForm
{
__published:// IDE-managed Components
TButton *Button1;
TMemo *Memo1;
void __fastcall Button1Click(TObject *Sender);
private:// User declarations
public:// User declarations
__fastcall TForm3(TComponent* Owner);
};
//---------------------------------------


extern PACKAGE TForm3 *Form3;
//---------------------------------------
#endif



unit3.cpp

// ---------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit3.h"
#include <Mshtml.h>
// ---------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm3 *Form3;

struct T_G_ZVET
{
String J_WGQJ;
String J_CKDA;
String J_DHZE;
};
// ---------------------------------------
__fastcall TForm3::TForm3(TComponent* Owner) : TForm(Owner)
{
}
// ---------------------------------------
void __fastcall TForm3::Button1Click(TObject *Sender)
{
HWND TheWindowHandle = FindWindowEx(NULL, NULL, L"IEFrame", NULL);
if (!TheWindowHandle)
{ // 如果找不到IE窗口
Application->BringToFront();
Memo1->Lines->Add(L"Internet Explorer浏览器没有启动,操作取消");
return;
}


int M_QHJI = 0;
// 入库时已经存在的
int M_RTJF = 0;
// 入库成功的

T_G_ZVET G_ZVET[1];

int C_TMFY = 0;

TCppShellWindows *CppShellWindows1 = new TCppShellWindows(NULL);

try
{
long lCopies = CppShellWindows1->get_Count();
// 此处取得的数量包括网页和资源管理器等
for (long m = 0; m < lCopies; m++)
{
TVariant va(m);
IWebBrowser2Ptr browser(CppShellWindows1->Item(va));
if (browser)
try
{
LPDISPATCH pDisp;

if (SUCCEEDED(browser->get_Document(&pDisp)))
try
{
if ((HWND)(browser->get_HWND()) != TheWindowHandle)
{
// 判断是否当前浏览器(注意:当前浏览器是指一个浏览器窗口实例,其中可能包含多个页面的选项卡)
// 如果仅仅操作当前页面的话,启用此处的  continue;
continue;
Memo1->Lines->Add(" continue");
// 跳过本次循环下面尚未执行的语句,接着执行下次循环
}
IHTMLDocument2 *pDoc2;
if (SUCCEEDED(pDisp->QueryInterface(IID_IHTMLDocument2, (void**)&pDoc2)))
try
{
Memo1->Lines->Add("===============================");
Memo1->Lines->Add("     " + IntToStr((int)m));
Memo1->Lines->Add("-------------------------------");

// 此处开始取得浏览器指针,如果不是IE浏览器就会是NULL


IHTMLElement *pElement;

if (SUCCEEDED(pDoc2->get_body(&pElement)))
try
{
// 一个IE进程可能打开多个IE选项卡,
// 目前还没有办法取得当前选项卡,
// 因此在循环中取出所有的。
// 使用时注意
BSTR BSTRUrl;
// 当前浏览器打开的网址
pDoc2->get_URL(&BSTRUrl);
if (BSTRUrl)
{
Memo1->Lines->Add(BSTRUrl);
// 当前浏览器打开的网址
G_ZVET[C_TMFY].J_WGQJ = BSTRUrl;
// 当前浏览器打开的网址
}
else
{
G_ZVET[C_TMFY].J_WGQJ = L"";
// 当前浏览器打开的网址
}
SysFreeString(BSTRUrl);
BSTR BSTRTitle;
// 当前页面标题
pDoc2->get_title(&BSTRTitle);
if (BSTRTitle)
{ //
Memo1->Lines->Add(BSTRTitle);
// 当前页面标题
G_ZVET[C_TMFY].J_CKDA = BSTRTitle;
// IE窗口的标题
}
else {
G_ZVET[C_TMFY].J_CKDA = L"";
// IE窗口的标题
}
SysFreeString(BSTRTitle);
BSTR BSTRTxt;
// 当前页面纯文本
pElement->get_innerText(&BSTRTxt);
// 当前页面纯文本
if (BSTRTxt)
{
Memo1->Lines->Add(BSTRTxt);
// 当前页面纯文本
G_ZVET[C_TMFY].J_DHZE = BSTRTxt;
// 当前页面纯文本
}
else
{
G_ZVET[C_TMFY].J_DHZE = L"";
// 当前页面纯文本
}
SysFreeString(BSTRTxt);
}
__finally
{
pElement->Release();
}
}
__finally
{
pDoc2->Release();
}
}
__finally
{
pDisp->Release();
                }
}
__finally
{
browser->Release();
}
}
}
__finally
{
delete CppShellWindows1;
}
}
// ---------------------------------------



退出也很正常的。页面也基本找出了。

热点排行