Visual C++ BHO question

D

Dave King

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<IHTMLDocument2> pHtmlDoc2;

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)&rcWorkArea,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
 
D

Dave King

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);
 
I

Ian Collins

Dave said:
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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,982
Messages
2,570,186
Members
46,743
Latest member
WoodrowMea

Latest Threads

Top