`
gauzeehom
  • 浏览: 31474 次
  • 性别: Icon_minigender_1
  • 来自: QZ
社区版块
存档分类
最新评论

VC6.0中,创建、调用 dll

阅读更多

参考链接:

如何使用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
分享到:
评论
1 楼 sdgshawn 2013-11-27  
多谢!帮我大忙了,嘿嘿

相关推荐

    VC6.0中_创建、调用dll(20150418211345).pdf

    VC6.0中_创建、调用dll(20150418211345).pdf

    VC6.0DLL.zip_VC6.0 .dll_vc6 dll_vc6.0_vc6.0dll

    4. **调用DLL函数**:在主程序中,像调用普通函数一样调用DLL中的函数。 5. **运行时**:当主程序运行时,操作系统会自动加载DLL,并将调用传递给DLL中的函数。 **显式链接DLL:** 与隐式链接不同,显式链接是在...

    VC6.0中调用Matlab的编程方法

    在使用VC6.0调用MATLAB之前,确保已经安装了MATLAB和MATLAB Compiler。MATLAB Compiler能将MATLAB代码编译成可以在C++环境中使用的MEX文件。 步骤二:创建MEX函数 在MATLAB环境中编写你需要在VC6.0中调用的MATLAB...

    DLL.rar_VC6.0 .dll_dll调用_vc6 dll

    这个例子展示了如何在DLL中实现这一功能,并在VC6.0下进行测试验证其正确性。 在压缩包内的文件中: 1. "www.pudn.com.txt"可能是一个来源于"Pudn"网站的说明文档或者下载链接,该网站是一个提供编程资源和教程的...

    VC6.0COM2.zip_VC6.0调用C#_vc6 调用C

    标题“VC6.0COM2.zip_VC6.0调用C#_vc6 调用C”涉及的主题是使用Microsoft Visual C++ 6.0(简称VC6.0)开发的COM组件如何被Visual Studio 2005中的C#代码调用。在这个过程中,我们将探讨COM(Component Object Model...

    Vc6.0中使用DLL和LIB举例

    首先,我们来看如何在VC6.0中创建DLL。 创建DLL需要新建一个项目,通常我们选择“Win32 Dynamic-Link Library”,并为其命名。在向导中选择创建“一个简单的DLL工程”。创建成功后,我们将得到一个dll.cpp文件和一...

    vc6.0调用webservice的方法

    ### vc6.0调用WebService的方法详解 在深入探讨如何使用Visual C++ 6.0(简称VC6.0)来调用WebService之前,我们首先需要了解几个基本概念:SOAP、WebService以及它们与VC6.0的关系。 #### SOAP(Simple Object ...

    VC 6.0下的Dll(显示调用和隐式调用)

    本篇文章将详细讲解如何在VC 6.0下创建和使用DLL,包括隐式调用和显示调用两种方式。 首先,我们要理解DLL的两种调用方式: 1. 隐式调用(Implicit Linking):在编译期间,通过在项目设置中添加引用到DLL的库文件...

    VC6.0 多国语言切换(DLL版本,包含DLL项目)

    标题“VC6.0 多国语言切换(DLL版本,包含DLL项目)”以及描述中的关键信息表明,这是一个关于使用Visual C++ 6.0实现多国语言支持的教程或资源包,特别是通过动态链接库(DLL)的方式进行语言切换。在软件开发中,...

    vc6.0免注册调用大漠

    在软件开发领域,尤其是对于使用Visual C++ 6.0(简称vc6.0)进行Windows应用程序开发的技术人员来说,“免注册调用大漠”这一主题非常重要。这里的大漠通常指的是大漠插件(DM),一个广泛应用于自动化测试、图像...

    vc++ 6.0使用dbghelp.dll生成dmp内存转储文件

    "miniDumpTest.cpp"和"miniDumpTestDlg.h"是实现内存转储功能的源代码文件,它们定义了如何调用dbghelp.dll的接口,如MiniDumpWriteDump函数,用于创建DMP文件。"miniDumpTest.rc"是资源脚本文件,用于定义程序的...

    VC6.0_DLL的使用

    在本教程中,我们将探讨如何在Visual C++ 6.0(简称VC6.0)环境下创建和使用DLL,以及如何从一个独立的.exe程序调用DLL中的类函数。 首先,理解DLL的基本概念是必要的。DLL是一个包含可执行代码和数据的文件,可以...

    采用VC6.0编写的串口DLL源码

    3. 注册与导出:为了让其他程序能够调用DLL中的函数,需要使用__declspec(dllexport)关键字来导出函数。在工程配置中,选择“生成DLL”选项,并生成相应的.lib文件供调用方链接。 4. 调用测试:创建一个独立的测试...

    (完整版)vc6.0编写DLL文件及vb调用示例.docx

    本教程将详细介绍如何使用Microsoft Visual C++ 6.0(简称VC6.0)来创建DLL文件,并展示如何在Visual Basic(VB)中调用这些DLL中的函数。 首先,创建DLL文件的过程分为以下几个步骤: 1. **创建新工程**:在VC6.0...

    VC6.0-depends查看dll工具[含msvcr90d.dll, ieshims.dll].rar

    总结来说,"VC6.0-depends"工具是VC6.0开发者不可或缺的辅助软件,它可以帮助我们理解和管理项目中的DLL依赖,而"msvcr90d.dll"和"ieshims.dll"则是程序正常运行的关键组件,分别提供了C++运行时支持和IE兼容性保证...

    VC 6.0下编译调试ffmpeg

    解压后,将`include`目录复制到VC 6.0的` INCLUDE `路径下,`lib`目录复制到`LIB`路径下,同时将`bin`目录下的`SDL.dll`复制到系统`system32`目录。这样,VC 6.0就能找到SDL的相关头文件和库文件。 ### 4. 设置VC ...

    vc6.0助手,适用于vc6.0开发环境

    安装过程中,它会检测用户的VC6.0安装情况,添加必要的组件,注册"VA_X.dll",并设置相应的配置,确保助手功能能够正常运行。 使用VC6.0助手,开发者可以享受以下几点优势: 1. **智能代码补全**:通过分析源代码...

    opencv+vc6.0配置文档(含opencv1.0)

    当你尝试编译项目时,VC6.0会自动寻找你在“Additional Dependencies”中指定的库文件。如果出现链接错误,确保你已经正确添加了所有需要的库,并且库文件路径无误。 7. **运行程序**: 成功编译并链接后,运行...

    基于VC6.0的TCPIP 通讯

    本项目是基于古老的Visual C++ 6.0(简称VC6.0)开发的TCP/IP通信程序,尽管VC6.0已经有些年头,但它仍然被许多开发者用来编写Windows应用程序,特别是对旧系统兼容性有要求的项目。 TCP/IP协议族是由Internet协议...

Global site tag (gtag.js) - Google Analytics