2010年8月6日

     摘要: PostMessage,SendMessage,SendNotifyMessage这三个函数是由windows操作系统提供的用来在窗口之间传递消息的API函数,三个函数的功能描述如下。PostMessage函数功能:该函数将一个消息放入(寄送)到与指定窗口创建的线程相联系消息队列里,不等待线程处理消息就返回,是异步消息模式。消息队列里的消息通过调用GetMessage和PeekMessage取得。...  阅读全文
posted @ 2010-08-06 10:13 小妹阿青 阅读(3711) | 评论 (0)编辑 收藏

2009年10月1日

Visual C++6.0 中可实现的DLL

         Visual C++6.0 支持自动生成Win32 DLL和MFC AppWizard DLL两种,其中Win32 DLL不使用MFC类库,其导出的函数是标准的C接口,能够被非MFC和MFC的应用程序调用,应用范围更广泛。所以下面就介绍Win32 DLL的开发。

         创建导出函数的Win32 DLL
1、启动Visual C++6.0,利用AppWizard创建一个“Win32 Dynamic-Link Library”类型的工程,工程名为SayHello。采用默认设置,即创建一个Win32 DLL的空项目。
2、为DLL工程添加头文件SayHello.h和源文件SayHello.cpp。在头文件SayHello.h中,声明DLL的导出函数Say和Sum,分别用来显示"Hello,World!"和求和。声明代码如下:

//SayHello.h
//

/*
extern "C"修饰词的作用是使C++编译器以C语言的方式对这个函数进行处理,以便供其他语言所用。
*/

extern "C" void _declspec(dllexport)Say(char* szWords,int nLen);                           //声明Say导出函数
extern "C" float _declspec(dllexport)Sum(float fNum1,float fNum2);   //声明Sum导出函数

在源文件SayHello.cpp中添加函数Say和Sum的实现代码,代码如下:

//SayHello.cpp
//

#include 
<string.h>
#include 
"SayHello.h"

void Say(char* szWords,int nLen)
{
    strcpy(szWords,
"Hello,World!");
    strcat(szWords,
"\0");
}

float Sum(float fNum1,float fNum2)
{
    
return fNum1+fNum2;
}

3、【F7】键编译生成DLL。此时在工程的Debug文件夹下生成实际代码文件SayHello.dll和导入库文件SayHello.lib。
4、从DLL中导出函数有两种方法,一种是使用_declspec(dllexport)关键字,如SayHello.h中所示;一种是添加.def文件(值得注意的是,添加的文件类型是文本文件,且名称应输入SayHello.def),代码如下:

;SayHello.def
;

LIBRARY 
"SayHello"
DESCRIPTION 
"导出DLL中的函数"
EXPORTS
    Say  @
1
    Sum  @
2

5、加载DLL分为静态加载和动态加载。动态加载(运行时动态链接,也叫显示链接)DLL是通过LoadLibrary、GetProcAddress和FreeLibrary这3个API函数进行的。调用如下:

typedef void(*SAY)(char*,int);
SAY Say;
typedef 
float(*SUM)(float,float);
SUM Sum;
HINSTANCE hdll;
hdll
=LoadLibrary("..\\..\\SayHello\\Debug\\SayHello.dll");
if(hdll!=NULL)
{
    
//GetProcAddress函数获得获得获得DLL导出函数地址
    Say=(SAY)GetProcAddress(hdll,"Say");
    Sum
=(SUM)GetProcAddress(hdll,"Sum");
}
else
{
    AfxMessageBox(
"无法加载DLL!");
    
return;
}
UpdateData(TRUE);
const int Len=20;
char p[Len];
Say(p,Len);
m_strDispHello.Format(
"%s",p);
m_fResult
=Sum(m_fNum1,m_fNum2);
UpdateData(FALSE);
FreeLibrary(hdll);
静态加载(加载时动态链接,也叫隐式链接)DLL是由编译系统完成对DLL的加载和应用程序结束时对DLL的卸载,需要将DLL的引用库文件(.lib)与应用程序进行静态链接。调用如下:
#pragma comment(lib,"SayHello.lib")
extern "C" _declspec(dllimport) void Say(char* szWords,int nLen); 
extern "C" _declspec(dllimport) float Sum(float fNum1,float fNum2);
此时就使用Say和Sum函数了。
posted @ 2009-10-01 18:39 小妹阿青 阅读(4065) | 评论 (1)编辑 收藏

创建导出类的Win32 DLL

          
DLL的开发与调用(一)介绍了导出函数Win32DLL的创建过程,这也是最常用的DLL。同样,在DLL中定义的类也可以被应用程序的进程访问。下面仍以实现显示Hello,World!和求和为例介绍。
1、创建一个名为SayHello的Win32 DLL的空项目。
2、选择“插入|类”,在弹出的新建类窗口中为工程创建类CSayHello。在类的头文件SayHello.h中,使用关键字_declspec(dllexport)声明导出类,并定义相关的成员变量和成员函数。代码如下:

// SayHello.h
//

class _declspec(dllexport) CSayHello  
{
public:
    CSayHello();
    
virtual ~CSayHello();
    
void Say(char* szWords,int nLen);
    
float Sum();
    
void SetNum(float fNum1,float fNum2);
private:
    
float fNo1;
    
float fNo2;

};

在类的实现文件中实现各成员函数,代码如下:

//SayHello.cpp
//

#include 
"SayHello.h"
#include 
<string.h>

CSayHello::CSayHello()
{
    fNo1
=fNo2=0.0;
}

CSayHello::
~CSayHello()
{

}

void CSayHello::Say(char* szWords,int nLen)
{
    strcpy(szWords,
"Hello,World!");
    strcat(szWords,
"\0");
}

float CSayHello::Sum()
{
    
return fNo1+fNo2;
}

void CSayHello::SetNum(float fNum1,float fNum2)
{
    fNo1
=fNum1;
    fNo2
=fNum2;
}

编译工程,在Debug文件夹下生成DLL文件SayHello.dll和导入库文件SayHello.lib。如果采用.def文件导出类,就得将类的所有函数或变量均导出。
3、调用DLL。在窗口类头文件中加载DLL中的导入库文件,包含SayHello.h头文件,并的声明CSayHello类对象。代码如下:

#include "SayHello.h"
#pragma comment(lib,
"SayHello.lib"

class CTestDlg : public CDialog
{
// Construction
public:
    CTestDlg(CWnd
* pParent = NULL);    // standard constructor
    CSayHello MySayHello;

此时,就可使用类对象的成员函数了。
          调用DLL中的导出类与调用DLL中的导出函数最大区别就是应用程序中需包含导出类的头文件。因此,需要将SayHello.h、SayHello.dll和SayHello.lib拷贝到调用者工程的根目录下,才能正确运行。
          调用导出类的DLL一般都采用加载时链接的方式。虽然也可以在运行时链接,但实现起来会很麻烦,需要从DLL中读取每一个成员函数的地址,而且通常这些函数的名字是预编译的符号,可能还要在DLL里给函数重新命名。

posted @ 2009-10-01 18:39 小妹阿青 阅读(2435) | 评论 (1)编辑 收藏
仅列出标题  

导航

<2024年4月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

统计

常用链接

留言簿

随笔分类

随笔档案

IT技术

趣闻轶事

搜索

最新评论

阅读排行榜

评论排行榜