Help | Site Map
Connecting Tech Pros Worldwide
 
 
LinkBack Thread Tools
  #1  
Old April 21st, 2007, 08:15 AM
Dave King
Guest
 
Posts: n/a
Default Visual C++ BHO question

Hi All-

I'm trying to customize this project ( http://www.codeproject.com/shell/IEMenuButton.asp
) and I'm getting an access voilation and was hoping somebody would be
able to give me some idea

Here's the method I'm trying to work with

STDMETHODIMP CMasterObject::Exec(const GUID*, DWORD nCmdID, DWORD,
VARIANTARG*, VARIANTARG*)
{
if(m_spUnkSite == 0 || m_pWebBrowser2 == 0) return S_OK;

HRESULT hRes = S_OK;

CComPtr<IDispatch pDocDisp;
CComQIPtr<IHTMLDocument2pHtmlDoc2;

hRes = m_pWebBrowser2->get_Document(&pDocDisp);
if(SUCCEEDED(hRes) && pDocDisp)
{
hRes = pDocDisp->QueryInterface(IID_IHTMLDocument2,
(void**)&pHtmlDoc2);
if(SUCCEEDED(hRes) && pHtmlDoc2)
{
SHANDLE_PTR nBrowser = 0;
m_pWebBrowser2->get_HWND(&nBrowser);
HWND hWndParent = (HWND)nBrowser;

POINT pt;
GetCursorPos(&pt);

HINSTANCE hInstance = _AtlBaseModule.GetModuleInstance();

HMENU hMenu = LoadMenu(hInstance,MAKEINTRESOURCE(IDR_MENU_POPUP) );
HMENU hMenuTrackPopup = GetSubMenu(hMenu, 0);

if(hMenuTrackPopup && hWndParent)
{
BOOL bIsChevron = FALSE;
HWND hWndMenuParent = NULL;
HWND hWndToolBar = NULL;

hWndMenuParent = hWndParent;
hWndToolBar = WindowFromPoint(pt);

if(m_bIsIe7)
{
HWND hWndIe7ActiveTab = hWndParent;
HWND hWnd = GetWindow(hWndParent, GW_CHILD);

// looking for the Internet Explorer_Server window
// this window should be a parent for TrackPopupMenu
if(hWnd)
{
TCHAR szClassName[MAX_PATH];
while(hWnd)
{
memset(szClassName,0,MAX_PATH);
GetClassName(hWnd, szClassName, MAX_PATH);
if(_tcscmp(szClassName,_T("TabWindowClass"))==0)
{
// the active tab should be visible
if(IsWindowVisible(hWnd))
{
hWnd = GetWindow(hWnd, GW_CHILD);
while(hWnd)
{
memset(szClassName,0,MAX_PATH);
GetClassName(hWnd, szClassName, MAX_PATH);

if(_tcscmp(szClassName,_T("Shell DocObject View"))==0)
{
hWnd = FindWindowEx(hWnd, NULL, _T("Internet
Explorer_Server"), NULL);
if(hWnd) hWndIe7ActiveTab = hWnd;
break;
}
hWnd = GetWindow(hWnd, GW_HWNDNEXT);
}
}
}
hWnd = GetWindow(hWnd, GW_HWNDNEXT);
}
}

if(hWndIe7ActiveTab) hWndMenuParent = hWndIe7ActiveTab;
}

int nIDCommand = -1;
BOOL bRightAlign = FALSE;
if(hWndToolBar)
{
ScreenToClient(hWndToolBar,&pt);
int nButton = (int)::SendMessage(hWndToolBar, TB_HITTEST, 0,
(LPARAM)&pt);
if(nButton>0)
{
TBBUTTON pTBBtn;
memset(&pTBBtn,0,sizeof(TBBUTTON));
if(::SendMessage(hWndToolBar, TB_GETBUTTON, nButton,
(LPARAM)&pTBBtn))
{
nIDCommand = pTBBtn.idCommand;
RECT rcButton;
if(::SendMessage(hWndToolBar,TB_GETRECT,nIDCommand ,
(LPARAM)&rcButton))
{
pt.x = rcButton.left;
pt.y = rcButton.bottom;
ClientToScreen(hWndToolBar,&pt);

RECT rcWorkArea;
SystemParametersInfo(SPI_GETWORKAREA,0,(LPVOID)&rc WorkArea,0);
if(rcWorkArea.right-pt.x<150)
{
bRightAlign = TRUE;
pt.x = rcButton.right;
pt.y = rcButton.bottom;
ClientToScreen(hWndToolBar,&pt);
}
}
}
}
else
{
GetCursorPos(&pt);
bIsChevron = TRUE;
}
}

UINT nFlags = TPM_NONOTIFY|TPM_RETURNCMD|TPM_LEFTBUTTON;
if(bRightAlign) nFlags |= TPM_RIGHTALIGN;
else nFlags |= TPM_LEFTALIGN;

// draw pressed button
if(nIDCommand!=-1 && !bIsChevron) ::SendMessage(hWndToolBar,
TB_PRESSBUTTON, nIDCommand, MAKELPARAM(1,0));
// popup the menu
int nCommand = TrackPopupMenu(hMenuTrackPopup, nFlags, pt.x, pt.y,
0, hWndMenuParent, 0);
// release the button
if(nIDCommand!=-1 && !bIsChevron) ::SendMessage(hWndToolBar,
TB_PRESSBUTTON, nIDCommand, MAKELPARAM(0,0));

switch (nCommand)
{
case ID_ITEM1:
MessageBox(hWndParent,_T("Item 1 is
selected"),_T("TestExtension"), MB_OK|MB_ICONEXCLAMATION);
break;
case ID_ITEM2:
MessageBox(hWndParent,_T("Item 2 is
selected"),_T("TestExtension"), MB_OK|MB_ICONEXCLAMATION);
break;
case ID_about:
MessageBox(hWndParent,_T("TestExtension 1.0\nCopyright © 2006
Igor Tolmachev\nhttp://www.itsamples.com"), _T("TestExtension"), MB_OK|
MB_ICONINFORMATION);
break;
}
}
}
}
return S_OK;
}


Basically I need to get the URL of the website that's in IE's window
and I'm getting an access violation error when I do it. I'm putting
this right before "switch (nCommand)"

pHtmlDoc2->get_URL(pURL);
BSTR outURL = *pURL;
_bstr_t(sURL);

This works sometimes but not others. I'm not sure if it's because the
page hasn't fully loaded or what it is, but I'd like to get it to work
all the time.

Thanks,
Dave

  #2  
Old April 21st, 2007, 08:15 AM
Dave King
Guest
 
Posts: n/a
Default Re: Visual C++ BHO question

Sorry I just realized I posted wrong, I've been trying lots of stuff
and it's late, anyways, this is what my part of the code should look
like

pHtmlDoc2->get_URL(pURL);
BSTR outURL = *pURL;
_bstr_t sURL(outURL);



  #3  
Old April 21st, 2007, 08:25 AM
Ian Collins
Guest
 
Posts: n/a
Default Re: Visual C++ BHO question

Dave King wrote:
Quote:
Sorry I just realized I posted wrong, I've been trying lots of stuff
and it's late, anyways, this is what my part of the code should look
like
>
pHtmlDoc2->get_URL(pURL);
BSTR outURL = *pURL;
_bstr_t sURL(outURL);
>
This realy should go to a windows programming group.

--
Ian Collins.
 

Bookmarks

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are Off
[IMG] code is Off
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On

What is Bytes?

We are a network of experts and professionals in IT and software development that help one another with answers to tough questions and share insights. Get the best answers to your questions from over network members.
Post your question now . . .
It's fast and it's free

Popular Articles