这段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;
//---------------------------------------
#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
// ---------------------------------------
#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;
}
}
// ---------------------------------------