(1)非MFC动态链接库编程
一. 非MFC动态链接库的生成;
1. 新建一个Win32 Dynamic-Link Library工程;命名为DLLTest;在下一步中选择的时候,选择一个简单的Dll工程。点击完成
2. 打开,DllTest.cpp文件,完善DllMain函数;
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH://进程加载时调用
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH://进程结束时调用
break;
default:
break;
}
return TRUE;
}
3. 编写自己的导出函数或变量;
如‘加’函数、阶乘函数和自己的消息框函数:
int Add(int x,int y)
{
return x+y;
}
int MyMultiply(int x)
{
if (x<0||x>30)
{
return -1;
}
else
{
int sum=1;
for(int i=1;i<=x;i++)
{
sum*=i;
}
return sum;
}
}
void MyMessageBox(char *str)
{
MessageBox(NULL,str,"Dll内部的函数哦!",MB_OK);
}//注意,要加上头文件#include<windows.h>
4. 定义.def文件,声明导出的函数或变量
新建一个.def格式的文本文件,并将其加入到工程;然后编写代码如下
LIBRARY DllTest
EXPORTS
Add @1
MyMultiply @2
MyMessageBox @3
/*其中,最重要的就是要注意LIBRARY和EXPORTS这两个关键字,LIBRARY 后面一定要跟工程名保持一致,否则会出错;EXPORTS后面为要导出的变量或着函数;本次导出了三个函数;注意,‘@’后面为导出的序号,一般为一个整数;注意不同的资源导出的序号要不相同;*/
5. 点击Build All;在Debug的文件夹下,出现一个DllTest.dll的文件名称;这个就是我们需要的动态连接库;
二. 非MFC动态链接库的使用;(动态方式)
1. 新建一个多文档的MFC应用程序;
2. 新增菜单项,编辑代码:以下是加函数的调用
typedef int(*pFun)(int ,int );
HINSTANCE hDLL;
pFun MyAdd;
hDLL=LoadLibrary("DllTest.dll");
if (hDLL!=NULL)
{
MyAdd=(pFun)GetProcAddress(hDLL,"Add");
int x=10;
int y=12;
int z;
z=MyAdd(x,y);
CString str;
str.Format("%d",z);
str="10+12="+str;
MessageBox(str);
}
else
{
MessageBox("DllTest.dll加载失败!请将DllTest.dll复制到当前目录下");
}
FreeLibrary(hDLL);
三. 静态调用
1. 新增菜单项,编辑代码:以下是加函数的调用和自定义提示框的调用;
int MyMultiply(int x);
void MyMessageBox(char *str);
void CUseDLLView::OnStaticMul()
{
#pragma comment(lib,"DllTest.lib")
int x=5;
int z;
z=MyMultiply(x);
CString str;
str.Format("%d",z);
str="5!="+str;
MessageBox(str);
MyMessageBox("你好!");
}
(2)非MFC动态链接库编程
一.MFC动态链接库的编程
1.新建一个MFC的DLL工程,命名为MfcDll.点击完成;VC++6.0会自动给生成一些代码;这些代码可以直接编译;
2.插入一个对话框资源,并新建一个对应的类;命名为CDllDlg
3.新建一个CDllDlg类型的全局指针CDllDlg *dlg=NULL;
4.编写void MyDllDlg()函数
void MyDllDlg()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
dlg=new CDllDlg;
dlg->Create(IDD_DIALOG1,NULL);
dlg->ShowWindow(SW_SHOW);
}
注意,每一个函数尽量要带AFX_MANAGE_STATE(AfxGetStaticModuleState());这条语句;
5.在.def文件中加入导出声明; MyDllDlg @1
二.测试
dll编写总结
原创
©著作权归作者所有:来自51CTO博客作者ali莫川的原创作品,请联系作者获取转载授权,否则将追究法律责任
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
BCB编写dll(转)
<br />BCB编写dll 转载 BCB编写dll 一.注意:创建动态链接库时,如果想你创建的动态链接库并非只用于C"命名约定,这
dll borland application winapi pascal -
编写、引用资源DLL步骤
创建纯资源 DLL 时要求 /NOENTRY 选项。(VS链接选项中设置无入口)使用该选项防止 LINK 将 _main 的引用链接到 DLL 中。VC版:1、向导生成一个DLG1
dll stream fp null delete -
java 有序的线程安全的集合
遍历List的多种方式在讲如何线程安全地遍历 List 之前,先看看遍历一个 List 通常会采用哪些方式。方式一: for(int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } 方式二: Iterator iterator = list.iterator(); while(it
java 有序的线程安全的集合 java 线程安全list java 线程安全的list java8 list 去重 java8 list去重 -
progressSQL
SQL语言和sqlplus常用的命令SQL概述结构化查询语言 (Structured Query Language),具有定义、查询、更新和控制等多种功能,是关系数据库的标准语言。注意: 大部分数据库都满足了sql标准,但是每个数据都会有自己的"方言"。比如说oralce 有序列, mysql有limitSQL分类:数据操纵语言DML Data Manipulation Language : SE
progressSQL SQL语言 java sqlplus常用命令 java 用户管理 java oracle数据库基本查找