参考链接:
如何使用VC6.0创建DLL
用VC6.0创建和调用win32 dll
1.使用 VC6.0 生成 DLL
新建项目 “Win32 Dynamic-Link Library”,输入项目名称,确定后选择 “A simple DLL project” 点击“完成”。
以下为cpp文件自动生成的代码:
#include "stdafx.h"
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}
编辑cpp文件:
在#include "stdafx.h"的下一行加入
extern "C" __declspec(dllexport) int fun(int a, int
b);
/*
这是C格式导出函数;
这种写法一般用在C++写的DLL中,指按C的规则导出这个函数,否则导出的函数会很怪;
加上 extern
"C" 表示按标准C格式导出函数.如果去掉仅兼容C++;
其中 int fun(int a, int b) 这部分代码是我们想用 dll 实现的函数原型声明
如果还想加入其他的可以继续加入 extern "C" __declspec(dllexport) int fun1(int a, int b);
*/
DllMain 是 DLL 的默认入口函数,类似于C语言的main函数,该例子无需修改此处,在 DllMain 的后面加入:
int fun(int a,int b)
{
return a+b;
}
这就是我们想用 DLL 实现的函数的定义,build 之后就会在 debug 目录下生成我们想要的 dll 文件
2.调用 DLL
新建一个 Win32 Console Application 工程,把刚才生成的 dll 文件拷贝到工程的根目录下
在 stdafx.h 文件中加入:#include <windows.h>
编辑cpp文件:
#include "stdafx.h"
typedef int (*PFUN)(int,int);
void main()
{
HMODULE hModule = ::LoadLibrary("dlltest.dll");
PFUN newfun = (PFUN)::GetProcAddress(hModule,"fun");
int i = newfun(1,2);
printf("The result is %d\n",i);
::FreeLibrary(hModule);
}
然后,运行就可以看到结果了
转
VC6.0下调用Dll文件提供的函数接口和全局变量
函数接口:
首先把生成的Dll文件(如RegularDll.dll和RegularDll.lib)拷贝到当前工程所在文件夹,调用有两种方法:
1)动态方法:
使用LoadLibrary和GetProcAddress等函数,例
typedef void (*lpFun)(void);
HINSTANCE
hDll;
hDll =
LoadLibrary("RegularDll.dll");
if
(NULL==hDll) {
MessageBox("Dll load
failed!");
}
lpFun
pShowDlg =
(lpFun)GetProcAddress(hDll,"ShowDlg");
if
(NULL == pShowDlg) {
MessageBox("Load function
\"ShowDlg\"
failed!");
}
pShowDlg();*/
2)静态声明方法:
创建Dll的工程中,函数声明和定义时用
_stdcall 修饰,例
void
_stdcall ShowDlg(void){...}
在调用dll的工程的文件中,在文件头部声明库和函数,如下例
#pragma comment(lib,"RegularDll.lib")
void
_stdcall
ShowDlg(void);
调用时直接ShowDlg()就可以了。
以上两种方法在VC6.0中调试成功,保证可用!
有的文章中说这样声明即可:
#pragma comment(lib,"RegularDll.lib")
void ShowDlg(void);
但在VC6.0下会报找不到函数ShowDlg的错误,不知是不是我没有设置好?
全局变量(访问Dll文件中的全局变量)
在创建Dll的工程中,在头文件中这样声明:
//lib.h
#ifndef _LIB_H
#define _LIB_H
#ifdef DLL_FILE
extern int
dllGlobalVar;
#else
extern int _declspec(dllimport) dllGlobalVar;
#endif
在创建Dll的工程的cpp文件中先定义DLL_FILE,再定义该变量,如下例:
//lib.cpp
#define DLL_FILE
#include "lib.h"
int dllGlobalVar; //define
BOOL APIENTRY DllMain(HANDLE
hModule, DWORD ul_reason_for_call, LPVOID
lpReserved)
{
switch(ul_reason_for_call) {
case DLL_PROCESS_ATTACH:
dllGlobalVar = 100; // initialization when dll
attached
break;
……
}
int _stdcall GetGlobalVar()
{
return
dllGlobalVar; // use the global variable
}
在调用Dll文件的工程中,需要访问该全局变量时,声明如下:
#include "..\\lib.h"
#pragma
comment(lib,"dllTest.lib")
然后可以当作普通的全局值变量使用和修改了!
printf("%d \n", dllGlobalVar);
dllGlobalVar = 234;
printf("%d \n", dllGlobalVar);
修改会影响本工程使用的值,不过内部实现的原理还不清楚:(
据说还有一种方法可以访问全局变量的指针形式,不过我一直没有试通,希望高人指点!
如有其他问题,欢迎邮件交流!(邮件地址见公告)
附件里是源码
工程 dlltest 用于生成 dll
工程 dllapp 调用生成的 dll
分享到:
相关推荐
VC6.0中_创建、调用dll(20150418211345).pdf
介绍VC6.0如何显示调用DLL,希望对用户有用
dll调用实例,输出当前程序的路径,vc6.0下测试通过。
VC6.0下如何生成DLL文件,然后用.exe程序去调用.dll文件里面的类函数。
vc++6.0 LoadLibrary方式调用HeapDLL.dll,测试HeapDLL.dll 的对外接口(含int传参、结构体传参、堆内存分配与释放)。 三、VbCallVcDll vb6.0 调用HeapDLL.dll,测试HeapDLL.dll 的对外接口(含int传参、结构体传参、...
十分简单的隐式调用和显示调用实例: 其中Lib工程文件用于生成动态连接库 D..Dll是动态调用 S..Dll是静态调用
opencv+vc6.0配置文档(含opencv1.0)
VC6.0开发的dll,在VB中做调用
VC 6.0从Dll中获取 数据的实现方法,主要功能是调用Dll进程数,判断当前调用Dll的线程有多少个。显示当前调用了多少个进程: CString strMessage = _T(""); strMessage.Format(_T("当前共%d个进程调用DLL。"), ...
在VC6.0中,隐式调用DLL例子。 在VC6.0中,隐式调用DLL例子。 在VC6.0中,隐式调用DLL例子。
将vs2008 CImage类封装成dll, 然后在vc6.0调用,包含dll源码以及vc6测试代码,很适合初学者研究!
适用于收费版和免费版的插件调用,示例分了两个,前者是dll文件的生成,其中包含了免注册调用大漠,下载后别忘记找到插件放进目录;后者是调用这个dll的具体方法,其实很简单,可经常会搞错...希望对您有用。
VB6.0调用 DLL版ZIP压缩文件夹目录和解压ZIP文件,网上很多源码不好用,所以就自己做了一个。原始代码是VC++的用VS2019编译了一个,DLL封装了下。调用很简单 '调用方法如下: 'CreateZipFileA "C:\123", "C:\123.zip...
vs2008 环境下C++代码调用vb6.0生成的Activex dll。
//新建MFC AppWizard[exe]工程。 //查看->建立类向导->Add Class...->From a type library...->选择"dm.dll"->OK //定义 #include "dm.h" Idmsoft dm; 然后看代码
本文给出了matlab小波工具箱里的小波包变换的m函数封装,并通过vc6的编译器进行编译输出,给出了编译后后供vc6调用的四个输出文件,包括ctf文件、dll文件、.h文件以及lib文件
本资源包含一个doc详细说明和 一个很简单的小...DLL采用VC的MFC AppWizard[dll]工程创建,一个MFC AppWizard[exe]调用DLL。本人根据doc的说明所做例子能够成功在VC6.0中运行,是DLL产生和调用的学习之基础之基础的知识
DLL(VC)编写和VB调用,基础的调用实例
在VS2005中,C#编写DLL并使用C++调用 在VS2005中C#编写的COM组件,使用VC6.0调用 在VC6.0中编写COM组件,使用VS2005 C#调用 在VC6.0中编写COM组件,使用VC6.0调用