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
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