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就能运行的版本 不知道如何下手 希望大侠不吝赐教!
...全文
274 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
  • 打赏
  • 举报
回复
沙发帮顶!
因文件超过20M不能上传,所以拆分为两个文件分次上传 第1章 COM背景知识 1.1 COM的起源 1.1.1 软件业面临的挑战 1.1.2 传统解决方案 1.1.3 面向对象程序设计方法 1.1.4 最终解决方案:组件软件 1.1.5 面向对象的组件模型——COM 1.2 COM的发展历程 1.2.1 COM以前的对象技术:DDE、OLE 1、VBX控件 1.2.2 COM首次亮相:OLE2 1.2.3 Microsoft拥抱Internet:ActiveX 1.2.4 更多的新名词:Windows DNA和COM+ 1.2.5 远程对象:ORBs和DCOM 1.2.6 COM的最新版本:COM+ 1.3 COM技术现状 1.3.1 COM与CORBA 1.3.2 COM与Enterprise Java Beans 1.3.3 Windows之外的COM 小结 第2章 从C++到COM 2.1 C++客户重用C++对象——例程DB 2.1.1 C++对象 2.1.2 客户程序 2.2 将C++对象移进DLL中——例程DB_cppdll 2.2.1 成员函数的引出 2.2.2 内存分配 2.2.3 Unicode/ASCII兼容 2.2.4 例程实现 2.2.4.1 修改接口文件 2.2.4.2 修改对象程序 2.2.4.3 修改客户程序 2.3 C++对象使用抽象基类——例程DB_vtbl 2.3.1 问题:私有数据成员被暴露 2.3.2 解决方案:抽象基类 2.3.2.1 什么是抽象基类(Abstract Base Class) 2.3.2.2 实现秘诀:虚函数(Virtual Functions) 2.3.3 使用抽象基类 2.3.4 例程实现 2.3.4.1 修改接口文件 2.3.4.2 修改对象程序 2.3.4.3 修改客户程序 2.4 改由COM库装载C++对象——例程dbalmostcom 2.4.1 COM库 2.4.2 对象创建的标准入口点 2.4.3 标准对象创建API 2.4.4 标准对象注册 2.4.5 例程实现 2.4.5.1 修改接口文件 2.4.5.2 修改对象程序 2.4.5.3 修改客户程序 2.5 将C++对象变成COM对象 2.5.1 引用计数 2.5.2 多接口 2.5.3 IUnknown接口 2.5.4 标准类厂接口:IClassFactory 2.5.5 对象代码的动态卸载 2.5.6 自动注册 2.5.7 例程实现 2.5.7.1 修改接口文件 2.5.7.2 修改对象程序 2.5.7.3 修改客户程序 2.6 为COM对象添加多接口支持 2.6.1 多接口 2.6.2 DEFINE_GUID 2.6.3 例程实现 2.6.3.1 修改接口文件 2.6.3.2 修改对象程序 2.6.3.3 修改客户程序 小结 第3章 COM基础知识 3.1 对象与接口 3.1.1 COM对象 3.1.2 COM接口 3.1.3 IUnknown接口 3.1.3.1 生存期控制:AddRef和Release 3.1.3.2 接口查询:QueryInterface 3.1.4 全球唯一标识符GUID 3.1.5 COM接口定义 3.1.6 接口描述语言IDL 3.2 COM应用模型 3.2.1 客户/服务器模型 3.2.2 进程内组件 3.2.3 进程外组件 3.2.4 COM库 3.2.5 HRESULT返回值 3.2.6 COM与注册表 3.3 COM组件 3.3.1 实现类厂对象 3.3.2 类厂对象的创建 3.3.3 实现自动注册 3.3.4 实现自动卸载 3.4 COM客户 3.4.1 COM对象创建函数 3.4.1.1 CoGetClassObject 3.4.1.2 CoCreateInstance 3.4.1.3 CoCreateInstanceEx 3.4.2 如何调用进程内组件 3.4.3 COM客户调用进程外组件 3.5 进一步认识COM 3.5.1 可重用机制:包容和聚合 3.5.2 进程透明性 3.5.3 安全性机制 小结 第4章 COM扩展技术 4.1 可连接对象机制 4.1.1 客户、接收器与可连接对象 4.1.1.1 接收器 4.1.1.2 可连接对象 4.1.1.3 客户 4.1.2 实现可连接对象 4.1.3 实现接收器 4.1.4 建立接收器与连接点的连接 4.1.5 获得出接口的类型信息 4.2 结构化存储 4.2.1 什么叫结构化存储和复合文件 4.2.2 存储对象和IStorage接口 4.2.2.1 IStorage接口 4.2.2.2 获得IStorage指针 4.2.2.3 释放STATSTG内存 4.2.2.4 枚举存储对象中的元

3,248

社区成员

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

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