IE ATL编程菜鸟请教 有个微软的例程 不知道如何修改

MmMVP 2007-12-22 04:46:40
http://download.microsoft.com/download/6/8/3/683DB9FE-8D61-4A3C-B7B8-3169FF70AE9F/atlbrowser.exe(可执行压缩包)
一个ATL浏览器代码
我想修改成不注册任何uuid就能运行的版本 不知道如何下手 希望大侠不吝赐教!
...全文
270 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
pzhuyy 2007-12-25
  • 打赏
  • 举报
回复
楼主是个强人,学习了.
MmMVP 2007-12-25
  • 打赏
  • 举报
回复
谢谢楼上各位的发言!
我只是需要从IWebBrowser2继承做一个类,同时实现以下接口:
public IOleClientSite,
public IOleCommandTarget,
public IOleInPlaceSite,
public IDocHostShowUI,
public IServiceProvider
因为MS的例程是用了自己的函数做接口 所以生成了UUID
我不需要那个接口,想改成类内实现的,而我不熟悉ATL部分的编程,所以请教大家。。。
我的意思是,想由com版本的代码,改为非com版本来实现
不知道现在大家明白我的意思了么。。。
tfq2002 2007-12-25
  • 打赏
  • 举报
回复
要实现com的功能,又不注册uuid
那干脆直接用浏览器控件酸了
oyljerry 2007-12-25
  • 打赏
  • 举报
回复
CComObjectRootEx
CComCoClass
在ATL,这是标准COM 对象需要继承的模板类...
r_swordsman 2007-12-25
  • 打赏
  • 举报
回复
lz是向直接从IWebBrowser2单继承...其他接口一个都不继承..对吧?
jameshooo 2007-12-24
  • 打赏
  • 举报
回复
没有GUID就不可能有COM组件,如果你不在注册表中注册你的组件,COM将永远找不到你的组件来调用。楼主实在是钻牛角尖。
yxz_lp 2007-12-24
  • 打赏
  • 举报
回复
真是死心眼,你再看看还有IID_IAtlBrCon调用没

#include "stdafx.h"
#include "resource.h"
#include "initguid.h"
#include "AtlBrowser.h"

#include "AtlBrowser_i.c"
#include "AtlBrCon.h"


LONG CExeModule::Unlock()
{
LONG l = CComModule::Unlock();
if (l == 0)
{
#if _WIN32_WINNT >= 0x0400
if (CoSuspendClassObjects() == S_OK)
PostThreadMessage(dwThreadID, WM_QUIT, 0, 0);
#else
PostThreadMessage(dwThreadID, WM_QUIT, 0, 0);
#endif
}
return l;
}
//
CExeModule _Module;
//
//BEGIN_OBJECT_MAP(ObjectMap)
// OBJECT_ENTRY(CLSID_AtlBrCon, CAtlBrCon)
//END_OBJECT_MAP()
//
//
//LPCTSTR FindOneOf(LPCTSTR p1, LPCTSTR p2)
//{
// while (*p1 != NULL)
// {
// LPCTSTR p = p2;
// while (*p != NULL)
// {
// if (*p1 == *p++)
// return p1+1;
// }
// p1++;
// }
// return NULL;
//}

/////////////////////////////////////////////////////////////////////////////
//
extern "C" int WINAPI _tWinMain(HINSTANCE hInstance,
HINSTANCE /*hPrevInstance*/, LPTSTR lpCmdLine, int /*nShowCmd*/)
{
lpCmdLine = GetCommandLine(); //this line necessary for _ATL_MIN_CRT
HRESULT hRes = CoInitialize(NULL);

// If you are running on NT 4.0 or higher you can use the following call
// instead to make the EXE free threaded.
// This means that calls come in on a random RPC thread
// HRESULT hRes = CoInitializeEx(NULL, COINIT_MULTITHREADED);

////_ASSERTE(SUCCEEDED(hRes));
//_Module.Init(ObjectMap, hInstance);
//_Module.dwThreadID = GetCurrentThreadId();
//TCHAR szTokens[] = _T("-/");

//int nRet = 0;
//BOOL bRun = TRUE;
//LPCTSTR lpszToken = FindOneOf(lpCmdLine, szTokens);
//while (lpszToken != NULL)
//{
// if (lstrcmpi(lpszToken, _T("UnregServer"))==0)
// {
// _Module.UpdateRegistryFromResource(IDR_AtlBrowser, FALSE);
// nRet = _Module.UnregisterServer();
// bRun = FALSE;
// break;
// }
// if (lstrcmpi(lpszToken, _T("RegServer"))==0)
// {
// _Module.UpdateRegistryFromResource(IDR_AtlBrowser, TRUE);
// nRet = _Module.RegisterServer(TRUE);
// bRun = FALSE;
// break;
// }
// lpszToken = FindOneOf(lpszToken, szTokens);
//}

//if (bRun)
//{
//hRes = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE);
//_ASSERTE(SUCCEEDED(hRes));

// // Create the Atl Browser Container
//CComPtr<IAtlBrCon> pApp;
//CoCreateInstance(CLSID_AtlBrCon, NULL, CLSCTX_INPROC_SERVER, IID_IAtlBrCon,
// (void**)&pApp);
//新加的
//CComPtr<IAtlBrCon> pApp;
CComPtr<CComObject<CAtlBrCon>> pApp;
CComObject<CAtlBrCon>::CreateInstance(&pApp);
//atlbr->QueryInterface(IID_IAtlBrCon,(void**)&pApp);
//end
if (pApp)
{
pApp->Run();

long hwnd;
HWND hwndApp;
pApp->GetHwnd(&hwnd);
hwndApp = (HWND)hwnd;

MSG msg;
while (GetMessage(&msg, 0, 0, 0))
{
HACCEL hAccel = LoadAccelerators(_Module.GetResourceInstance(),
MAKEINTRESOURCE(IDR_ACCELERATOR));
_ASSERT(hAccel);
if (!::TranslateAccelerator(hwndApp, hAccel, &msg))
{
// Avoid the beep when in the combo box
if (msg.wParam != VK_RETURN && msg.wParam != VK_TAB)
::TranslateMessage(&msg);

//
// If we get a keydown message, we must get send the message
// to the container window so that the message can be routed to
// the correct window. This is necessary so that the container
// window can call TranslateAccelerator on the in-place active
// object and so that VK_RETURN and VK_TAB messages received from
// the combobox in the toolbar will be processed correctly.
//
if (msg.message == WM_KEYDOWN)
::SendMessage(hwndApp, msg.message, msg.wParam, msg.lParam);

::DispatchMessage(&msg);
}
}
}

//_Module.RevokeClassObjects();
//}

CoUninitialize();

return 0;
}

MmMVP 2007-12-24
  • 打赏
  • 举报
回复
谢谢楼上不厌其烦地解答!
你的代码虽然使AtlBrowser.cpp中没有调用了。可是AtlBrCon这个类的定义里AtlBrCon.cpp依然有调用。。。
class ATL_NO_VTABLE CAtlBrCon :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CAtlBrCon, &CLSID_AtlBrCon>,---------》这里有
public CWindowImpl<CAtlBrCon>,
public IDispatchImpl<IAtlBrCon, &IID_IAtlBrCon, &LIBID_ATLBROWSERLib>,----》这里也有
public IOleClientSite,
public IOleInPlaceSite,
public IDocHostUIHandler,
public IDocHostShowUI
MmMVP 2007-12-23
  • 打赏
  • 举报
回复
谢谢楼上朋友!
atlbr->QueryInterface(IID_IAtlBrCon,(void**)&pApp);

IID_IAtlBrCon
这个clsid还是被调用了
如果我不想使用哪个tlb,而换成自己的函数,可以吗?
还有
class ATL_NO_VTABLE CAtlBrCon : 
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CAtlBrCon, &CLSID_AtlBrCon>,
public CWindowImpl<CAtlBrCon>,
public IDispatchImpl<IAtlBrCon, &IID_IAtlBrCon, &LIBID_ATLBROWSERLib>,
public IOleClientSite,
public IOleInPlaceSite,
public IDocHostUIHandler,
public IDocHostShowUI


这个类定义处的IID_IAtlBrCon CLSID_AtlBrCon,如何删除呢?
yxz_lp 2007-12-23
  • 打赏
  • 举报
回复
更改后的代码


#include "stdafx.h"
#include "resource.h"
#include "initguid.h"
#include "AtlBrowser.h"

#include "AtlBrowser_i.c"
#include "AtlBrCon.h"


LONG CExeModule::Unlock()
{
LONG l = CComModule::Unlock();
if (l == 0)
{
#if _WIN32_WINNT >= 0x0400
if (CoSuspendClassObjects() == S_OK)
PostThreadMessage(dwThreadID, WM_QUIT, 0, 0);
#else
PostThreadMessage(dwThreadID, WM_QUIT, 0, 0);
#endif
}
return l;
}

CExeModule _Module;

BEGIN_OBJECT_MAP(ObjectMap)
OBJECT_ENTRY(CLSID_AtlBrCon, CAtlBrCon)
END_OBJECT_MAP()


LPCTSTR FindOneOf(LPCTSTR p1, LPCTSTR p2)
{
while (*p1 != NULL)
{
LPCTSTR p = p2;
while (*p != NULL)
{
if (*p1 == *p++)
return p1+1;
}
p1++;
}
return NULL;
}

/////////////////////////////////////////////////////////////////////////////
//
extern "C" int WINAPI _tWinMain(HINSTANCE hInstance,
HINSTANCE /*hPrevInstance*/, LPTSTR lpCmdLine, int /*nShowCmd*/)
{
lpCmdLine = GetCommandLine(); //this line necessary for _ATL_MIN_CRT
HRESULT hRes = CoInitialize(NULL);

// If you are running on NT 4.0 or higher you can use the following call
// instead to make the EXE free threaded.
// This means that calls come in on a random RPC thread
// HRESULT hRes = CoInitializeEx(NULL, COINIT_MULTITHREADED);

_ASSERTE(SUCCEEDED(hRes));
_Module.Init(ObjectMap, hInstance);
_Module.dwThreadID = GetCurrentThreadId();
TCHAR szTokens[] = _T("-/");

int nRet = 0;
BOOL bRun = TRUE;
LPCTSTR lpszToken = FindOneOf(lpCmdLine, szTokens);
//while (lpszToken != NULL)
//{
// if (lstrcmpi(lpszToken, _T("UnregServer"))==0)
// {
// _Module.UpdateRegistryFromResource(IDR_AtlBrowser, FALSE);
// nRet = _Module.UnregisterServer();
// bRun = FALSE;
// break;
// }
// if (lstrcmpi(lpszToken, _T("RegServer"))==0)
// {
// _Module.UpdateRegistryFromResource(IDR_AtlBrowser, TRUE);
// nRet = _Module.RegisterServer(TRUE);
// bRun = FALSE;
// break;
// }
// lpszToken = FindOneOf(lpszToken, szTokens);
//}

if (bRun)
{
//hRes = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE);
//_ASSERTE(SUCCEEDED(hRes));

// // Create the Atl Browser Container
//CComPtr<IAtlBrCon> pApp;
//CoCreateInstance(CLSID_AtlBrCon, NULL, CLSCTX_INPROC_SERVER, IID_IAtlBrCon,
// (void**)&pApp);
//新加的
CComPtr<IAtlBrCon> pApp;
CComObject<CAtlBrCon>* atlbr;
CComObject<CAtlBrCon>::CreateInstance(&atlbr);
atlbr->QueryInterface(IID_IAtlBrCon,(void**)&pApp);
//end
if (pApp)
{
pApp->Run();

long hwnd;
HWND hwndApp;
pApp->GetHwnd(&hwnd);
hwndApp = (HWND)hwnd;

MSG msg;
while (GetMessage(&msg, 0, 0, 0))
{
HACCEL hAccel = LoadAccelerators(_Module.GetResourceInstance(),
MAKEINTRESOURCE(IDR_ACCELERATOR));
_ASSERT(hAccel);
if (!::TranslateAccelerator(hwndApp, hAccel, &msg))
{
// Avoid the beep when in the combo box
if (msg.wParam != VK_RETURN && msg.wParam != VK_TAB)
::TranslateMessage(&msg);

//
// If we get a keydown message, we must get send the message
// to the container window so that the message can be routed to
// the correct window. This is necessary so that the container
// window can call TranslateAccelerator on the in-place active
// object and so that VK_RETURN and VK_TAB messages received from
// the combobox in the toolbar will be processed correctly.
//
if (msg.message == WM_KEYDOWN)
::SendMessage(hwndApp, msg.message, msg.wParam, msg.lParam);

::DispatchMessage(&msg);
}
}
}

//_Module.RevokeClassObjects();
}

CoUninitialize();

return nRet;
}


在AtlBrowser.cpp文件中

#include "stdafx.h"
#include "AtlBrowser.h"
#include "AtlBrCon.h"
#include "ExDispID.h"
#include "WBCmdGroup.h"
#include "DispIds.h"
//#include <strstrea.h>//如果编译通不过就注释掉,改成下面两行代码,我这里通不过。。。
#include <strstream>
using namespace std;
MmMVP 2007-12-23
  • 打赏
  • 举报
回复
up
菜鸟问题 不要见笑。。
MmMVP 2007-12-22
  • 打赏
  • 举报
回复
谢谢帮顶的朋友以及楼上的宝贵意见!
我对atl编程不熟悉,我所说的“不用注册”是指不生成CLSID就能执行的com。
微软的例子生成了一个CLSID,然后调用CComCoClass以及IDispatchImpl这两个接口。
我不知道可不可以换成别的接口 不需要把我的类的CLSID作为参数的。也不需要给我的类分配clsid
因为我的类是对IWebBrowser2的封装。。
sjdev 2007-12-22
  • 打赏
  • 举报
回复
我没有下载代码来看,先发表一下“臆见”:

不用注册,考虑两种
1:自注册,这种情况没什么说的啦,在运行这个exe时,会自动注册。
2:手动注册,那只好找一个可执行程序,让他代劳,在这个可执行程序中注册那些需要手动注册的组件,不过不推荐。

另:一个疑问
你所说,“不用注册”是指不允许它注册,还是指不用手动去注册?
alphagm 2007-12-22
  • 打赏
  • 举报
回复
沙发帮顶!

3,248

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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