博文

用ATL实现VC插件(3)(2008-03-24 22:16:00)

摘要:用ATL实现VC插件   作者: IUNKNOW 出处: vchelp   增加命令对应的方法:

  1) 如果要增加一条命令,必须在Icopyright中增加相应的方法。如在示例程序中我增加了MiniWindow这个命令,那么我在Icopyright中也必须增加MiniWindow这样一个方法 (在ClassWizard中鼠标右键Icopyright,在弹出菜单中选择Add Method 即可增加方法)

  示例程序程序中共增加了四个命令:ShowInfoDlg,MiniWindow,MaxWindow和Test,应此必须在Icopyright接口中实现此四个方法

  7)实现工具条后,就是实现具体的方法了,具体的实现请参看Ccopyright中的四个方法

STDMETHODIMP CCopyright::ShowInfoDlg()
STDMETHODIMP CCopyright::MaxWindow()
STDMETHODIMP CCopyright::MiniWindow()
STDMETHODIMP CCopyright::Test()
STDMETHODIMP CCopyright::ShowInfoDlg()
{
// TODO: Add your implementation code here
USES_CONVERSION;
CUserInfoDlg dlg;
dlg.m_bstrName = m_bstrName;
dlg.m_bstrEmail = m_bstrEmail;
if(dlg.DoModal() == IDOK)
{
m_bstrName = dlg.m_bstrName;
m_bstrEmail = dlg.m_bstrEmail;
}
CRegKey reg;
reg.Create(HKEY_CURRENT_USER,_T("Software\\Evesoft\\AddIns"));
reg.SetValue(OLE2CT(m_bstrName),_T("NAME"));
reg.SetValue(OLE2CT(m......

阅读全文(2434) | 评论:0

用ATL实现VC插件(2)(2008-03-24 22:15:00)

摘要:用ATL实现VC插件   作者: IUNKNOW 出处: vchelp   如果我增加一条这样的命令AddCommand(CComBSTR(_T("ShowInfoDlg\n显示\n修改用户版权信息\n显示")),CComBSTR(_T("ShowInfoDlg")), 0, dwAddInID, &bRet);在Categroy的All Commands中就能找到ShowInfoDlg这条命令。AddCommandBarButton()方法就是向IDE集成环境增加一个工具条按钮,程序中可以不调用此方法,可以手动拖拉到工具条上。打开菜单Tools/Customize 用鼠标拽拉你需要的的命令到工具条上即可(如图)



  在Ccopyright 类NewDocument()方法中的代码,主要就是增加必要的版权信息到文档中,此处主要是说明怎样操作VC环境中文档,大家也得到具体的Windows来修改窗口的形状和属性,怎么修改就要看各自的想象力了。

HRESULT CCopyright::NewDocument(IDispatch* theDocument)
{
CComQIPtr <ITextDocument,&IID_ITextDocument> pTextDoc(theDocument);
HRESULT hr = S_OK;
CComBSTR bstrLang;
if (pTextDoc == NULL) return hr;

hr = pTextDoc->get_Language(&bstrLang);
if (FAILED(hr))
return hr;
//&micro;&Atilde;&micro;&frac12;&Icirc;&Auml;&frac14;
&thorn;&Agrave;à&ETH;&Iacute;&pound;&not;&sup2;&cent;
&micro;&Atilde;&sup3;&o......

阅读全文(2732) | 评论:0

用ATL实现VC插件(1)(2008-03-24 22:14:00)

摘要:用ATL实现VC插件   作者: IUNKNOW 出处: vchelp   4) 选择属性对话框的Names标签,在C++组的Short Name编辑框输入Copyright(如图)



  5) 选择DevStudio Add-in标签,在Add-in Features中选择Application Events,选择OK按钮确定



  上面的步骤生成基本Add-in框架代码

  6) 创建IDE工具条

   a) 创建两个Bitmap 文件作为工具条图像资源

    IDB_TOOLBAR_LARGE_COPYRIGHT 32 x 32大小

    IDB_TOOLBAR_MEDIUM_COPYRIGHT 16 x 16 大小

   b) 在Ccopyright 类的OnConnection()函数中加入创建工具条按钮的代码, 详细代码:

HRESULT CCopyright::OnConnection(IApplication* pApp,
VARIANT_BOOL bFirstTime, long dwAddInID, VARIANT_BOOL* bOnConnection)
{
HRESULT hr = S_OK;
m_spApplication = pApp;
m_dwAddInID = dwAddInID;

// Connect up to application event sink
AtlAdvise(pApp, GetUnknown(), IID_IApplicationEvents, &m_dwAppEvents);

hr = pApp->SetAddInInfo((long)_Module.GetModuleInstance(),
static_cast<ICopyright*>(this), IDB_TOOLBAR_MEDIUM_COPYRIGHT,
IDB_TOOLBAR_LARGE_COPYRIGHT, dwAddInID);

// LP......

阅读全文(2741) | 评论:0

用ATL实现VC插件(2008-03-24 22:12:00)

摘要:用ATL实现VC插件   作者: IUNKNOW 出处: vchelp   要实现Add-in Object 有三种方法,一种是利用ATL COM Wizard中的ATL对象 Add-in Object来实现,另一种是利用DevStudio Add-in Wizard来实现,第三种就是手工写所有的代码,如果手工写,一定要记住实现IDSAddIn接口,这样才能才能增加新的命令和工具条到VC的IDE环境中去。

  我主要是讲解ATL COM Wizard,所以我用第一种方法来实现。在这里我实现了IApplicationEvents 和 IDSAddIn接口,实现IapplicationEvents接口是应为我要对Application 对象进行操作,比如NewDocument()、WorkspaceOpen()等等方法。而实现IDSAddIn接口,是应为要增加新的命令和工具条到VC的IDE环境中去。

  示例程序实现的功能:

  1)在VC的IDE环境中增加一个工具条(4个按钮),并且能操纵VC的IDE环境,(工具条如下图) 第一个按钮弹出对话框允许修改用户信息,第二个按钮最小化所有打开的窗口,第三个最大化所有的窗口,第四个按钮弹出一个Messagbox。



  2)对每一个新建的文档,根据文档类型在文件头自动加上版权信息和相关内容注释。

  观看效果:下载源代码,编译后生成Sample_02.dll,然后在VC的环境中,选择菜单tools/customize ,然后选择最后一个Add-ins and Macro Files 标签,选择Browse按钮,选择刚才编译后的Sample_02.dll文件,然后在Add-ins adn Macro列表框中选中Copyright Class ,然后Close Customize对话框,这时VC的IDE环境就会出现一个有四个按钮的工具条(见上图)。大家可以分别点击这几个按钮看看效果,也可分别在VC环境中(新建)New 几种类型的文件(.cpp ,.h .htm 和.txt文件)看看文件头是否加上版权信息.

  下面一步步引导大家来实现此例子程序:

  1) 用ATL COM Wizard......

阅读全文(2094) | 评论:0

例程详析动态链接库(2007-11-08 19:17:00)

摘要: 例程详析动态链接库
 
  动态链接库(DLL,即 Dynamic-Link Library)是可执行的模块,但它没有自己的堆栈,必须在调用动态链接库函数的程序环境下运行。动态链接库不仅可以作为一个运行模块,包括函数代码,而且可以包含程序以外的任何数据或资源(位图、图标等等)。动态链接库就是给应用程序提供函数或者资源。

  动态链接与静态链接是相对立的。静态链接的时候,可执行程序内包含了所访问的函数的代码,可执行程序占用的空间较大;但运行时,不需要其他模块支持,从而速度相对较快。动态链接的可执行程序中不包含动态访问的函数代码,仅仅包含对它的参考,运行时需要其他模块(DLL)的支持,速度相对较慢。

  动态链接库是Windows的一种极其重要的技术。它使得开发人员可以通过编写动态链接库,方便灵活的实现大型程序的开发,按自己的意愿对操作系统进行扩展。

  下面通过例子介绍如何在动态链接库中定义函数、资源、和类以及如何在工程中使用动态链接库中已定义的函数、资源、类。  
  一、 函数的定义和使用方法:

  第一步:

   运行AppWizard,定义项目名为mydll,选择MFC AppWizard(dll),而不是MFC AppWizards(exe)。

  第二步:

   在这个例子中,只有一个AppWizard屏幕出现,选择MFC扩展DLL(MFC Extension DLL (using shared MFC DLL),点击FINISH生成工程。

  第三步:

   点击File中的New,选择C/C++ Header File,File Name中输入dll,点击OK,创建dll.h。输入extern "C" __declspec(dllexport) int fun(int x1,int x2,int x3); ,保存。

  第四步:

   点击File中的New,选择C++ Source File,File Name中输入dll,点击OK,创建dll.cpp。输入

  #include "stdafx.h"
  #include ......

阅读全文(2321) | 评论:0

调用Windows的动态链接库[转](2007-11-08 19:16:00)

摘要:调用Windows的动态链接库


  许多熟练使用C的程序员在使用PowerBuilder时都希望自己以前在C上做的工作可以被PowerBuilder引用,这是完全可以的。
在PowerBuilder中你可以通过外部引用函数的形式来调用动态连接库中的函数。
PowerBuilder调用DLL程序使用规则

PowerBuilder可以支持任何一种非PowerScript编写,并存储在动态链接库中的外部函数或过程的调用。但外部函数的参数必须是符合Pascal规则的(即参数压栈顺序从前至后)。
在函数调用前,因先作函数声明,PowerBuilder支持以下两种外部函数类型:
·全局函数:可以在应用的任意位置调用;
·局部外部函数:在window,menu,userobject或用户自定义函数等对象中定义。 外部函数声明的语法是:

{Access}FUNCTIONReturnDataTypeFunction-Name({REF}{DataTypelArg1,...,DataTypeNArgN})LIBRARYLibName
外部过程声明的语法是:
{Access}SUBROUTIONSubroutine({REF}{DataType1Arg1,...,DataTypeNArgN})

如果您使用的是局部外部函数的声明,您还可以指定对象的访问权限:Public,Private,Protected。对局部函数权限访问的限制同对对象的实例变量的限制相同。
您可以指定对象名加函数名的方式调用外部函数:
object.function(arguments)
如在window的w_emp上调用局部外部函数Recog(),就可这样使用:
w_emp.Recog()
如何在PowerBuilder与DLL之间传递参数

在PowerBuilder的script中调用DLL中的函数,缺省情况下是通过传值法来传递参数(passedbyvalue),也就是说PowerBuilder将对要传递的参数做一份拷贝,然后通过堆栈将这份拷贝传递给函数。如果你希望DLL中的函数可以改变调用参数的原值,就可以通过参考传值法(passedbyre......

阅读全文(3523) | 评论:0

DLL的调试(2007-11-08 19:14:00)

摘要: DLL的调试 假设:
    要调试hook.dll hook.h hook.lib 1。建立一个新工程Test,将hook整个工程目录拷贝到Test目录下 2。在Test工程中需要用到hook.dll的源文件中(或stdafx.h中)加入
     #include ".\hook\hook.h"
   这样在该源文件中使用"::"就可以索引到hook.h中所有的导出函数、
   变量以及类
  
3。在Test的工程设置->Link->Object/library modules中加入
     ./hook/debug/hook.lib 4。编译连接好Test之后,发现未找到hook.dll. 这需要设置path.
   可以在工程设置->Debug->Working directory中加入
     e:\Test\hook\debug\
   也可以在autoexe.bat中设置路径 5。通过工程->Insert Project into Workspace将hook.dsp工程加入 
   Test项目中。 6。设置hook工程为活动工程,在工程>Debug>Executable for 
   Debug session中加入: 
     e:\test\debug\test.exe 7。现在设置断点,按F5可以正常调试了 注意:当调试的DLL被映射到其他的应用程序(非TEST)进程空间并运行时,在该DLL中设置的断点无效,当然可以通过MessageBox来查看变量,若该DLL是MFC扩展DLL,则还可以用TRACE或afxDump来查看变量。......

阅读全文(2678) | 评论:0

创建“通用的”动态链接库(DLL)--VCKBASE(2007-11-08 19:13:00)

摘要: 创建“通用的”动态链接库(DLL) VCKBASE     最近有许多人问如何让动态链接库的输出函数能够被任何支持动态链接库的语言调用。写动态链接库是很EASY的事情。但是,他们大多觉得输出的名字有乱字符(如:_vbShiftRight@1)。本文将讨论如何让DLL输出的函数名字中不出现乱子符。以便让创建的DLL可以在VB中使用。
    首先需要实现DLL的入口点函数并保证代码使用 stdcall 调用规范,但这要依赖你使用的编译器。例如,你可以在VC中使用“/entry:"DLLEntry"”命令行编译选项来创建自己的入口点。“DLLEntry” 可以参考下列代码: ///////////////////////////////////////////////////////////////////// // DLL initialization and clean-up. BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {    switch(fdwReason) {         case DLL_PROCESS_ATTACH:            // Perform any DLL initialization here          break;         case DLL_PROCESS_DETACH:            // Perform any DLL cleanup here          break;    &nb......

阅读全文(2767) | 评论:0

Windows下DLL编程技术及应用(2007-11-08 19:12:00)

摘要:Windows下DLL编程技术及应用     李为民 (国防科技大学电子工程学院ATR室 长沙 410073)   摘 要: 本文介绍了DLL技术在Windows编程中的基本运用方法及应用,给出了直接内 存访问及端口I/O的两个实用DLL的全部源代码。 关键词: DLL Windows编程 内存访问 I/O   一 、引 言 由于Windows为微机提供了前所未有的标准用户界面、图形处理能力和简单灵便的操 作,绝大多数程序编制人员都已转向或正在转向Windows编程。在许多用户设计的实 际应用系统的编程任务中,常常要实现软件对硬件资源和内存资源的访问,例如端 口I/O、DMA、中断、直接内存访问等等 。若是编制DOS程序,这是轻而易举的事 情,但要是编制Windows程序,尤其是WindowsNT环境下的程序,就会显得较困难。 因为Windows具有"与设备无关"的特性,不提倡与机器底层的东西打交道,如果直接 用Windows的 API函数或I/O读写指令进行访问和操作,程序运行时往往就会产生保 护模式错误甚至死机,更严重的情况会导致系统崩溃。那么在Windows下怎样方便地 解决上述问题呢?用DLL(Dynamic Link Libraries)技术就是良好途径之一。 DLL是Windows最重要的组成要素,Windows中的许多新功能、新特性都是通过DLL来 实现的,因此掌握它、应用它是非常重要的。其实Windows本身就是由许多的DLL组 成的,它最基本的三大组成模块Kernel、GDI和User 都是DLL,它所有的库模块也都 设计成DLL。凡是以.DLL、.DRV、.FON、.SYS和许多以.EXE为扩展名的系统文件都是 DLL,要是打开Windows\System目录,就可以看到许多的DLL模块。 尽管DLL在Ring3优先级下运行,仍是实现硬件接口的简便途径。DLL可以有自己的数 据段,但没有自己的堆栈,使用与调用它的应用程序相同的堆栈模式,减少了编程 设计上的不便;同时,一个DLL在内存中只有一个实例,使之能高效经济地使用内 存;DLL实现的代码封装性,使得程序简洁明晰;此外还有一个最大的特点,即DLL 的编制与具体的编程语言及编译器无关,只要遵守DLL......

阅读全文(2389) | 评论:0

教你认识动态链接库DLL文件 (2007-11-08 19:11:00)

摘要: 教你认识动态链接库DLL文件     DLL是Dynamic Link Library的缩写,意为动态链接库。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。一个应用程序可有多个DLL文件,一个DLL文件也可能被几个应用程序所共用,这样的DLL文件被称为共享DLL文件。DLL文件一般被存放在C:WindowsSystem目录下。


  1、如何了解某应用程序使用哪些DLL文件

  右键单击该应用程序并选择快捷菜单中的“快速查看”命令,在随后出现的“快速查看”窗口的“引入表”一栏中你将看到其使用DLL文件的情况。

  2、如何知道DLL文件被几个程序使用

  运行Regedit,进入HKEY_LOCAL_MACHINESoftwareMicrosrftWindowsCurrent-
VersionSharedDlls子键查看,其右边窗口中就显示了所有DLL文件及其相关数据,其中数据右边小括号内的数字就说明了被几个程序使用,(2)表示被两个程序使用,(0)则表示无程序使用,可以将其删除。

  3、如何解决DLL文件丢失的情况

  有时在卸载文件时会提醒你删除某个DLL文件可能会影响其他应用程序的运行。所以当你卸载软件时,就有可能误删共享的DLL文件。一旦出现了丢失DLL文件的情况,如果你能确定其名称,可以在Sysbckup(系统备份文件夹)中找到该DLL文件,将其复制到System文件夹中。如果这样不行,在电脑启动时又总是出现“***dll文件丢失……”的提示框,你可以在“开始/运行”中运行Msconfig,进入系统配置实用程序对话框以后,单击选择“System.ini”标签,找出提示丢失的DLL文件,使其不被选中,这样开机时就不会出现错误提示了。  ......

阅读全文(2300) | 评论:0