C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
USES_CONVERSION and CComBSTR, вытаскивание URL из IE
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

Вернуться в Вопросы программирования в C++Builder