Guest |
Отправлено: 16.12.2005, 02:58 |
|
Не зарегистрирован
|
нашел тут пример как вытащить и IE URL да вот только при компиляции вылетают след. ошибки
[C++ Warning] atlwin.h(1579): W8017 Redefinition of 'MESSAGE_HANDLER' is not identical
[C++ Warning] Unit1.cpp(58): W8004 '_convert' is assigned a value that is never used
[C++ Error] Unit1.cpp(58): E2451 Undefined symbol '_convert'
Что тое ему не нравиться USES_CONVERSION; и вообще хотелось бы узнать эта за функция W2T() и где можно почитать, а то половины применяемых функций в данном примере нет в HELPE
CODE |
void F()
{
LONG nCount;
CComBSTR bsUrl;
CComPtr<IDispatch> pDispDoc;
CoInitialize(NULL);
try
{
CComPtr<IShellWindows> spShWin;
if (FAILED(spShWin.CoCreateInstance( __uuidof( ShellWindows))))
// Получаем количество открытых окон
spShWin->get_Count( &nCount);
Form1->Memo1->Lines->Add(IntToStr(nCount)+"Shell windows list");
// std::cout << ((nCount)?"Shell windows list:":"none ...") << std::endl;
for (int i=0; i<nCount; i++)
{
// Получаем очередное окно
CComPtr<IDispatch> pDisp;
spShWin->Item( CComVariant(i), &pDisp);
CComQIPtr<IWebBrowser2> pIE( pDisp);
if (pIE == NULL)
// throw "Unable to query Internet Explorer object";
// Получаем URL закруженного документа (открытой папки)
USES_CONVERSION;
pIE->get_LocationURL( &bsUrl);
[B] LPTSTR lpstrUrl = W2T(bsUrl);[/B]
// Пробуем получить html-документ
pIE->get_Document( &pDispDoc);
CComQIPtr<IHTMLDocument2> pHtmlDoc( pDispDoc);
// Если документ удается получить, значит это окно Internet Explorer'а
if (pHtmlDoc)
{
Form1->Memo1->Lines->Add("Internet Explorer: " + CString(lpstrUrl));
// Ради примера, меняем цвет фона на синий
pHtmlDoc->put_bgColor( CComVariant( L"blue"));
}
// иначе это просто Explorer
else
{
Form1->Memo1->Lines->Add(" Window Explorer: " + lpstrUrl);
// Закроем окно
pIE->Quit();
}
}
}
catch(char* lpstrErr) {
Form1->Memo1->Lines->Add("lpstrErr");
}
catch(...) {
Form1->Memo1->Lines->Add("Unknown error...");
}
CoUninitialize();
return;
}
| |
|
GIZMO |
Отправлено: 16.12.2005, 19:11 |
|
Машинист паровоза
Группа: Участник
Сообщений: 174
|
Жесткий примерчик, даже CString есть! Сам правил?
QUOTE (Guest @ 16/12/2005, 02:58) |
Что тое ему не нравиться USES_CONVERSION; и вообще хотелось бы узнать эта за функция W2T()
|
W2T — ATL 3.0 String Conversion Macros
Пользуйся WideString вместо CComBSTR
это убери USES_CONVERSION;
Вообще можно обойтись без ATL, пользуйся "родными" смарт-поинтерами и классами.
QUOTE (Guest @ 16/12/2005, 02:58) |
и где можно почитать, а то половины применяемых функций в данном примере нет в HELPE
|
CComBSTR, CComPtr, CComQIPtr — см. MSDN (ATL) или исходники смотри в Билдере 5,6 ATL 3.0.
IDispatch, IWebBrowser2, IHTMLDocument2 — см. MSDN или соотв хедеры.
Отредактировано GIZMO — 16/12/2005, 19:12
|
|
Guest |
Отправлено: 17.12.2005, 14:03 |
|
Не зарегистрирован
|
изменил CComBSTR bsUrl на WideString bsUrl;
pIE->get_LocationURL(&bsUrl.Detach());
LPTSTR lpstrUrl= W2T(bsUrl.Detach());
прежние ошибки исчезли но появились новые
CODE |
[C++ Error] Unit1.cpp(190): E2027 Must take address of a memory location
[C++ Error] Unit1.cpp(191): E2451 Undefined symbol '_lpw'
[C++ Error] Unit1.cpp(191): E2451 Undefined symbol '_convert'
[C++ Error] Unit1.cpp(191): E2285 Could not find a match for 'AtlW2AHelper(char *,undefined,undefined)'
| |
|
GIZMO |
Отправлено: 20.12.2005, 22:27 |
|
Машинист паровоза
Группа: Участник
Сообщений: 174
|
QUOTE (Guest @ 17/12/2005, 14:03) | §Ъ§Щ§Ю§Ц§Я§Ъ§Э CComBSTR bsUrl §Я§С WideString bsUrl;
pIE->get_LocationURL(&bsUrl.Detach());
LPTSTR lpstrUrl= W2T(bsUrl.Detach());
§б§в§Ц§Ш§Я§Ъ§Ц §а§к§Ъ§Т§Ь§Ъ §Ъ§г§й§Ц§Щ§Э§Ъ §Я§а §б§а§с§У§Ъ§Э§Ъ§г§о §Я§а§У§н§Ц
CODE |
[C++ Error] Unit1.cpp(190): E2027 Must take address of a memory location
[C++ Error] Unit1.cpp(191): E2451 Undefined symbol '_lpw'
[C++ Error] Unit1.cpp(191): E2451 Undefined symbol '_convert'
[C++ Error] Unit1.cpp(191): E2285 Could not find a match for 'AtlW2AHelper(char *,undefined,undefined)'
|
|
CODE |
//---------------------------------------------------------------------------
#ifndef MainH
#define MainH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
#include <utilcls.h>
// ShellWindows
#include <exdisp.h>
// MSHTML
#include <mshtml.h>
// Dispatch IDS for IExplorer Dispatch Events
#include <exdispid.h>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TPanel *Panel1;
TListBox *ListBox1;
TSplitter *Splitter1;
TMemo *Memo1;
TPanel *Panel2;
TSplitter *Splitter2;
TButton *GetHTMLBtn;
TButton *Button1;
void __fastcall FormCreate(TObject *Sender);
void __fastcall GetHTMLBtnClick(TObject *Sender);
void __fastcall Button1Click(TObject *Sender);
private: // User declarations
TComInterface<IShellWindows> m_spSHWinds;
void ConnectToShell();
public: // User declarations
__fastcall TForm1(TComponent* Owner);
void EnumIEInstance();
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void TForm1::ConnectToShell()
{
CoInitialize(NULL);
if(m_spSHWinds) return;
//
// Create Instance ShellWindows
//
if(m_spSHWinds.CreateInstance(CLSID_ShellWindows) == S_OK) {
//
// Sink for Events
//
//m_spIEEventsSink = new TIEEventsSink();
//m_spIEEventsSink->Connect(m_spSHWinds);
;
}
else
ShowMessage("Shell Windows interface is not avilable");
}
//---------------------------------------------------------------------------
void TForm1::EnumIEInstance()
{
ListBox1->Clear();
// get windows
LONG nCount;
m_spSHWinds->get_Count( &nCount);
for (int i=0; i<nCount; i++)
{
// get next window
TComInterface<IDispatch> pDisp;
m_spSHWinds->Item( Variant(i), &pDisp);
TComInterface<IWebBrowser2> pIE;
pDisp->QueryInterface(IID_IWebBrowser2, (LPVOID*)&pIE);
if (pIE)
{
// get URL
WideString wsUrl;
pIE->get_LocationURL( &wsUrl);
// trying to get htmldoc
TComInterface<IDispatch> pDispDoc;
pIE->get_Document( &pDispDoc);
TComInterface<IHTMLDocument2> pHtmlDoc;
pDispDoc->QueryInterface(IID_IHTMLDocument2, (LPVOID*)&pHtmlDoc);
// if Ok, — Internet Explorer'Ё¤
if (pHtmlDoc)
{
//see it work...
//pHtmlDoc->put_bgColor( CComVariant( L"blue"));
IWebBrowser2* pBrowser = pIE;
pBrowser->AddRef();
ListBox1->Items->AddObject(String("Internet Explorer: ") + wsUrl, (TObject*)pBrowser);
// connect events
//...
}
// else — Explorer
else
{
//ListBox1->Items->Add(String("Window Explorer: ") + wsUrl);
// Close Window
//pIE->Quit();
}
}
else
ShowMessage("Unable to query Internet Explorer object");
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
ConnectToShell();
EnumIEInstance();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::GetHTMLBtnClick(TObject *Sender)
{
int index = ListBox1->ItemIndex;
if(index != -1)
{
IWebBrowser2* pBrowser = (IWebBrowser2*)ListBox1->Items->Objects[index];
if(pBrowser) {
TComInterface<IDispatch> pDispDoc;
if(pBrowser->get_Document(&pDispDoc) == S_OK)
if(pDispDoc) {
TComInterface<IHTMLDocument2> pHtmlDocument;
pDispDoc->QueryInterface(IID_IHTMLDocument2, (LPVOID*)&pHtmlDocument);
TComInterface<IHTMLElement> pHtmlElement;
pHtmlDocument->get_body(&pHtmlElement);
if(pHtmlElement) {
WideString wsHtmlDoc;
pHtmlElement->get_outerHTML(&wsHtmlDoc);
Memo1->Clear();
Memo1->Lines->Add(wsHtmlDoc);
}
}
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
EnumIEInstance();
}
//---------------------------------------------------------------------------
|
§Ј§а§д, §г§Ъ§Э§о§Я§а §б§а§й§Ъ§Ь§С§Я§а, §У§н§Х§Ц§в§Я§е§Э §а§г§Я§а§У§Я§а§Ц. §±§а§Э§е§й§Ъ§Э§а§г§о §Ю§С§Э§а§г§д§о §Т§Ц§г§д§а§Э§Ь§а§У§а, §Я§а §г§Ю§н§г§Э §б§а§Я§с§д§о §Ю§а§Ш§Я§а. §І§С§Щ§Т§Ъ§в§С§Ы§г§с.
Отредактировано GIZMO — 21/12/2005, 10:35
|
|
|