博文
例程详析动态链接库(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 ......
调用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......
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来查看变量。......
创建“通用的”动态链接库(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......
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......
教你认识动态链接库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文件,使其不被选中,这样开机时就不会出现错误提示了。
......
CSDN 2007热点技术职位排行及点析『转』(2007-10-16 18:37:00)
摘要:编者按
在众多的网络招聘媒体中,CSDN人才频道专注于IT人才信息与服务。截至2007年9月,在CSDN人才频道注册的企业数量,已经超15000家,与CSDN人才频道合作的企业会员数量,也已经超过了3000家。主要人才信息分布在互联网开发、企业开发、应用软件开发、电信/通讯、软件外包几大领域。 CSDN人才频道每日活跃职位数在2000条左右。我们按照同类职位的点击数及用户关注度,提取了18个2007年1~8月的热点职位,并对这些职位进行了比对分析。从职位的活跃程度,我们可以看出一段时间以来,企业对人才的需求走势。
Top-1 职位名称:.NET开发工程师
职位描述:熟悉Microsoft .NET Framework 框架。精通C#,ASP.NET,ADO.NET和windows form编程。熟悉sqlserver等常用数据库。精通面向对象分析,熟悉企业设计模式。熟悉Web程序代码安全,有独立软件设计和开发能力。
职位点评:从现在.NET的在各个行业的使用情况来看,这个职位的需求将长期占据技术类招聘排行榜的重要位置。需求大,人员多,竞争自然激烈。富有经验能独当一面的程序员当然到哪里都受到欢迎。无论是从事企开发还是Web开发,具备系统设计和分析能力的.NET开发的工程师,在市场上更有竞争力
Top-2 职位名称:JAVA开发工程师
职位描述:精通Java开发语言以及JVM性能优化、熟练使用至少一种现有J2EE通用开源框架,熟悉JAVA相关的技术体系结构。对Mysql、SQLserver等主流数据库其中之一有深入的了解及实际开发经验。熟悉CSS、AJAX、RSS等Web技术,有Javascipt开发经验。
职位点评:虽然受到了.NET的强力阻击,但是由于其在开源方面的影响力,在可遇见的将来,JAVA仍然是一股强大的力量。由于JAVA开发者的数量比较多,多掌握一些开源工具和组件可以提高自己的竞争优势。
Top-3 职位名称:PHP开发工程师
职位描述:精通PHP语言,具备互联网应用开发经验。精通 Mysql 数据库。具有MySQL索引优化、查询优化和存储优化经验、PHP缓存技术、静态化设计方面的经验。掌握JavaScript,C......
ATL布幔之下的秘密(5) (2007-10-05 14:23:00)
摘要:作者:Zeeshan Amjad
译者:李马 (home.nuc.edu.cn/~titilima )
原文出处: http://www.codeproject.com/atl/atl_underthehood_5.asp
下载本文配套源代码
介绍
很多人认为ATL只是用来编写COM组件的,其实你也可以使用ATL中的窗口类来创建基于窗口的应用程序。虽然你可以将基于MFC的程序转换为ATL,但是ATL中对于UI(译注:用户界面)组件的支持太少了。所以,这就要求你需要自己编写很多代码。例如,在ATL中没有文档/视图,所以在你想使用它的时候就需要自己实现了。在本篇中,我们将要探究一些关于窗口类的秘密,以及ATL技术实现的秘密。WTL(Window Template Library,窗口模板库),虽然到现在(译注:本文于2002年10月27日发表在CodeProject)还不为Microsoft所支持,但是它在制作图形应用程序方面跨出了一大步。WTL就是基于ATL的窗口类的。
在开始讨论基于ATL的程序之前,让我们从一个经典的Hello world程序开始吧。这个程序完全用SDK编写,并且我们中几乎所有人都已经熟悉它了。
程序66. #include <windows.h>LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){ char szAppName[] = "Hello world"; HWND hWnd; MSG msg; WNDCLASS wnd; wnd.cbClsExtra = NULL; wnd.cbWndExtra = NULL; wnd.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wnd.hCursor ......
ATL布幔之下的秘密(4) (2007-10-05 14:21:00)
摘要:作者:Zeeshan Amjad
译者:李马 (home.nuc.edu.cn/~titilima )
原文出处: http://www.codeproject.com/atl/atl_underthehood_4.asp
介绍
到现在为止,我们还没有讨论过任何有关汇编语言的东西。但是如果我们真的要了解ATL底层内幕的话,就不能回避这一话题,因为ATL使用了一些底层的技术以及一些内联汇编语言来使它更小巧快速。在这里,我假设读者已经拥有了汇编语言的基础知识,所以我只会集中于我的主题,而不会再另外写一份汇编语言的教程。如果你尚未足够了解汇编语言,那么我建议你看一看Matt Pietrek于1998年2月发表在Microsoft System Journal的文章《Under The Hood》,这篇文章会给予你关于汇编语言足够的信息的。
现在就要开始我们的旅行了,那么先以这个简单的程序作为热身吧:
程序55. void fun(int, int) {}int main() { fun(5, 10); return 0;}现在在命令行模式下,使用命令行编译器cl.exe来编译它。在编译的时候,使用-FAs开关,例如,如果程序的名字是prog55的话:Cl -FAs prog55.cpp这就会生成一个带有相同文件名,扩展名为.asm的文件,这个文件中包含有以下程序的汇编语言代码。现在看看生成的输出文件,让我们首先来讨论函数的调用吧。调用函数的汇编代码是类似这个样子:push 10 ; 0000000aHpush 5call ?fun@@YAXHH@Z ; fun首先,函数的参数以自右而左的顺序入栈,然后再调用函数。但是,函数的名称和我们给定的有所不同,这是由于C++编译器会对函数的名称作一些修饰已完成函数的重载。让我们稍微修改一下程序,重载这个函数,再来看看代码的行为吧。
程序56. void fun(int, int) {}void fun(int, int, int) {}int main() { fun(5, 10); fun(5, 10, 15); return 0;}现在调用这两个函数的汇编代码是类似这个样子:push 10 ......
ATL布幔之下的秘密(3)(2007-10-05 14:20:00)
摘要:作者:Zeeshan Amjad
译者:李马 (home.nuc.edu.cn/~titilima )
原文出处: http://www.codeproject.com/atl/atl_underthehood_3.asp
介绍
如果你是个模板的高手,你就可以将ATL的学习作为一种享受。在这一节中,我将要尝试解释一些ATL使用的模板技术。我不能保证你读完本节后能成为一个模板高手,只能是尽我所能让你在读完本文后能够更轻松地理解ATL的源码。
程序35. #include <iostream>using namespace std;template <typename T>T Maximum(const T& a, const T& b) { return a > b ? a : b;}int main() { cout << Maximum(5, 10) << endl; cout << Maximum(''A'', ''B'') << endl; return 0;}程序的输出为:10B在这里,由于模板函数的关系,我们就没有必要分别重载int和char数据类型的函数版本了。其中很重要的一点是,函数的两个参数类型必须一致。但是如果我们传入了不同的数据类型,我们就需要告知编译器应该把这个参数考虑为哪种数据类型。
程序36. #include <iostream>using namespace std;template <typename T>T Maximum(const T& a, const T& b) { return a > b ? a : b;}int main() { cout << Maximum<int>(5, ''B'') << endl; cout << Maximum<char>(5, ''B'') << endl; return 0;}程序的输出为:66B我们也可以编写类模板,下面就是一个简单版本的堆栈类模板。
程序37. #inclu......