win32 dll程序报错

奋斗小青年 2011-11-02 09:49:23
我现在想写一个获取当前IE URL的程序,建的是win32 dll project.我的源码如下。

// PATH.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"
#include <atlbase.h>
#include <mshtml.h>


BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
//CComPtr < IOleContainer > spContainer;
//m_spClientSite->GetContainer( &spContainer );
//CComQIPtr < IHTMLDocument2 > spDoc = spContainer;
//if ( spDoc )
//{
// 已经得到了 IHTMLDocument2 的接口指针
//}

::CoInitialize(NULL);
CComPtr< IShellWindows > spShellWin;
HRESULT hr = spShellWin.CoCreateInstance( CLSID_ShellWindows );
if(SUCCESSED(hr))
{
spShellWin->get_Count(&ies); //获取当前IE数目
if(!ies) return bret;

for(int i=0; i<ies; i++)
{
CComPtr< IDispatch > pDispIE;
HRESULT hr=spShellWin->Item( CComVariant( (long)i ), &pDispIE );
if ( FAILED ( hr ) ) continue;

CComQIPtr< IWebBrowser2 > pBrowser = pDispIE;
if ( !pBrowser ) continue;

CComPtr < IDispatch > pDispDoc;
hr = pBrowser->get_Document( &pDispDoc );
if ( FAILED ( hr ) ) continue;

CComQIPtr< IHTMLDocument2 > pDocument2 = pDispDoc;
if ( !pDocument2 ) continue;

CComBSTR bstrURL;
pDocument2->get_URL( &bstrURL );//获得url
}
}
::CoUninitialize();

//STR bsrt;
//IHTMLDocument2::get_URL(&bstr);

//char szUrl[MAX_URL] ;
//strcpy(szUrl,OLE2A(bstr)) ;


return TRUE;
}

报各种错误 往各位大神指教下。
...全文
77 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
奋斗小青年 2011-11-02
  • 打赏
  • 举报
回复
麻烦哪位大哥大姐帮我整理下啊,谢谢啦,很急啊
奋斗小青年 2011-11-02
  • 打赏
  • 举报
回复
但是我写的控制台程序也是这样啊,控制台也报一样的错 源码如下。
#include "stdafx.h"
#include < atlbase.h >
#include < mshtml.h >


int main(int argc, char* argv[])
{
BSTR *strURL;
CComPtr <IOleContainer> spContainer;
m_spClientSite-> GetContainer(&spContainer);
CComQIPtr <IHTMLDocument2> spDoc = spContainer;
CComQIPtr <IWebBrowser2> pWebBrowser;
if (spDoc)
{
// 已经得到了 IHTMLDocument2 的接口指针
CComQIPtr <IHTMLWindow2> spWin2;
CComQIPtr <::IServiceProvider> isp; // 为什么要加::,原因是我使用了using namaspace shockwaveflash;
HRESULT hr = spDoc-> get_parentWindow(&spWin2);
if (FAILED(hr))
return hr;
isp = spWin2;
//spWin2-> QueryInterface(IServiceProvider, &isp); // 上面那句换成这个也可以
CComQIPtr <IWebBrowserApp> iwba;
// SID_SWebBrowserApp 和 IID_IWebBrowserApp 定义是一样的
hr = isp-> QueryService(IID_IWebBrowserApp, IID_IWebBrowserApp, (void **)&iwba);
if (FAILED(hr))
return hr;
hr = isp-> QueryService(IID_IWebBrowserApp, IID_IWebBrowser2, (void **)&pWebBrowser);
if (FAILED(hr))
return hr;

hr = pWebBrowser-> get_LocationURL(strURL);
if (FAILED(hr))
return hr;
return S_OK;
}

printf("Hello World!\n");
return 0;
}

奋斗小青年 2011-11-02
  • 打赏
  • 举报
回复
那我的接口是这样的。我头文件与CPP分别要怎么弄,DLLMAIN怎么调用我的?有特定格式么?各位麻烦帮我写下,我以前做LINUX的 这一点都不熟。 这是我的实现函数
BOOL   XDDDDDObject::GetLocationURL(BSTR   *strURL) 
{
CComPtr <IOleContainer> spContainer;
m_spClientSite-> GetContainer(&spContainer);
CComQIPtr <IHTMLDocument2> spDoc = spContainer;
CComQIPtr <IWebBrowser2> pWebBrowser;
if (spDoc)
{
// 已经得到了 IHTMLDocument2 的接口指针
CComQIPtr <IHTMLWindow2> spWin2;
CComQIPtr <::IServiceProvider> isp; // 为什么要加::,原因是我使用了using namaspace shockwaveflash;
HRESULT hr = spDoc-> get_parentWindow(&spWin2);
if (FAILED(hr))
return hr;
isp = spWin2;
//spWin2-> QueryInterface(IServiceProvider, &isp); // 上面那句换成这个也可以
CComQIPtr <IWebBrowserApp> iwba;
// SID_SWebBrowserApp 和 IID_IWebBrowserApp 定义是一样的
hr = isp-> QueryService(IID_IWebBrowserApp, IID_IWebBrowserApp, (void **)&iwba);
if (FAILED(hr))
return hr;
hr = isp-> QueryService(IID_IWebBrowserApp, IID_IWebBrowser2, (void **)&pWebBrowser);
if (FAILED(hr))
return hr;

hr = pWebBrowser-> get_LocationURL(strURL);
if (FAILED(hr))
return hr;
return S_OK;
}
return S_FALSE;
}

ouyh12345 2011-11-02
  • 打赏
  • 举报
回复
建一个导出接口的dll工程,里面就有导出变量和函数的例子
奋斗小青年 2011-11-02
  • 打赏
  • 举报
回复
怎么弄啊?我不会啊。大家说下细节步骤 谢谢了
ouyh12345 2011-11-02
  • 打赏
  • 举报
回复
各种ul_reason_for_call都会调用DllMain的
ouyh12345 2011-11-02
  • 打赏
  • 举报
回复
不要在DllMain里做事情
导出一个接口,做初始化
奋斗小青年 2011-11-02
  • 打赏
  • 举报
回复
各位帮帮忙啊 谢谢啊
风雨扬尘 2011-11-02
  • 打赏
  • 举报
回复
DLL一般都要导出函数,你把你的功能写到一个函数中然后导出,而不是吧功能代码全写在DllMain函数里面

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧