决这一问题上的
帮助。
先声明下,我此前从未涉及过Windows 下的编程,所以对于懂了这么点东西就要写篇文章,
大家可不要鄙视啊。
实际上,写这篇文章的最主要原因是,我觉得调用.dll 文件里的函数应该是个很简单,很常
规的用法,可是遗憾的是,我就查这么点东西,可以说是费尽了周折,足足耗了将尽两天的
时间在网上“漫游”,到是也有很多人写过类似的东西,但是,很遗憾,也许是因为他们觉得
的太简单而不想多罗嗦吧,我到最后愣是没有找到能看懂的。难道像我这样的初学者,就为
了搞清楚这么一点东西,还要系统的学一遍Windows 不成?!
You Must:
似乎只要懂得基本的C 语言就能看懂这篇文章了吧。
本文主要写给,像我这样的,很少编写Windows 下程序的程序员或者工程师们的。因此你
不需要懂得Windows,不需要懂得VC6,只要知道基本的C 就够了。
Total:
看了很多文章,包括MSDN 上得文档,讲了很多关于dll 的东西,一会儿有连什么API 呀、
COM 呀、MFC 呀的都出来了。晕~真晕,我就是想知道怎么调用.dll 文件里的函数,真的有
这么难吗?在这里,我不想拷贝粘贴有关“隐式链接”“显式链接”的概念,我只想分下面两种
情况讲解:
开始
一、对于已有.lib 和.h 文件的情况
(一)为了方便读者亲自验证与学习,这里首先带领大家建立一个带有.lib 和.h 的.dll 文
件。
1.首先打开VC6,File=>New ,在Projects 选项卡中选"Win32 Dynamic-Link Library" ,
在Project name 中输入"DLL_1",在Location 中输入"D:/DLL_1",然后单击ok 按钮。
2.选择"A DLL that exports some symbols"项后单击Finish 按钮。
3.单击ok 按钮,来确认你新建的项目。
4.工程建好后,首先要按下F7链接一下。不首先做这一步的话编译时会报错。
5.
单击图中最下面的FileView 选项卡,双击打开Source Files 文件夹下的DLL_1.cpp 文件。
6.请看这几行代码,实际上这是VC6自动为我们生成的几个范例,包括一个变量、一个
函数和一个类,他们就是最终生成.dll 文件后可以被调用的东东。
// This is an example of an exported variable
DLL_1_API int nDLL_1=0;
// This is an example of an exported function.
DLL_1_API int fnDLL_1(void)
{
return 42;
}
// This is the constructor of a class that has been exported.
// see DLL_1.h for the class definition
CDLL_1::CDLL_1()
{
return;
}
我们将这几行范例通通删掉,替换为我们自己的代码:
DLL_1_API int fTest()
{
return 253;
}
7.双击打开上图中Header Files 文件夹下的DLL_1.h 文件,逐一看这些代码:
// This class is exported from the DLL_1.dll
class DLL_1_API CDLL_1 {
public:
CDLL_1(void);
// TODO: add your methods here.
};
extern DLL_1_API int nDLL_1;
DLL_1_API int fnDLL_1(void);
这些实际上就是上面提到的三个范例的生命,当然我们把它替换成我们的代码:
DLL_1_API int fTest(void);
8.好了,接下来我们直接F7,然后再看看你的"D:/DLL_1/Debug"目录,怎样?是不是看
到了我们可爱的DLL_1.dll 和DLL_1.lib 文件?而DLL_1.h 文件则在"D:/DLL_1"目录中了。
(二)接下来,我们就来实现调用.dll 文件中的int fTest()函数。
1.首先我们关闭刚刚做好的工程。File=>Close Workspace,然后单击“是(Y)”按钮,保
存我们刚才所做的一切。
2. 我们新建一个控制台工程File=>New ,在Projects 选项卡里选"Win32 Console
Application",Project name 中输入EXE_1,在Location 中输入D:/EXE_1,然后单击ok 按钮。
然后,确认选中"An empty project"后,单击Finish 按钮。然后单击ok 按钮确认。
3.下面新建一个.cpp 文件:File=>New,在Files 选项卡中,选择"C++ Source File",在File
中输入Main,单击ok 按钮。
4.在Main.cpp 文件中输入下面的代码:
#include "iostream.h"
#include "DLL_1.h"
void main()
{
int a;
a = fTest(); //这个就是我们调用的dll 文件中的函数了
cout<<a<<endl;
}
5.在编译链接之前,我们还要做一些工作:
a.把上文提到的DLL_1.h、DLL_1.dll 和DLL_1.lib 复制到"D:/EXE_1"目录下
b.Project=>Settings...
在Link 选项卡中的"Object/library modules:"的最后,添加上"DLL_1.lib",注意用空格与前面
的lib 隔开。然后单击OK 按钮。
6.然后编译、链接、运行试试?
哈哈~这个“253”意味着什么?
当然,同样的,关于DLL 中变量和类的调用,我想应该是大同小异吧。
二、对于,仅有.dll 文件的情况
实际上,我这次遇到的问题就是属于这种类型的,查的我好苦啊,现在终于解决了。:)
当然,.dll 文件在被提供时,应该也同时提供了一个说明文档,文档中应该已经给出了你可
以调用的函数的功能及函数原型。如果他没有提供函数原型,那还需要一些手段来获得它,
有关获取函数原型的方法,本文不做讨论。
这里首先给出我拿到的dll 文件及其中的可被调用的函数原型:
=======================================
kingvewcliend.dll(这个是DLL 文件的文件名)中可被调用的函数有:
1、int ReadItemNo();
返回值:
返回组态王OPC 中列出的项目总数
2、int StartCliend(char* node);
入口参数:
node 为机器节点名称
返回值:
返回建立连接错误码
=======================================
(一)接下来,是实现调用kingvewcliend.dll 文件中的int ReadItemNo();函数的方法:
和上面讲的(一、(二)2.~3.)相同,先建立好控制台工程和cpp 文件,然后输入下面的代
码:
#include "stdio.h"
#include "windows.h"
void main()
{
int a;
HINSTANCE dll123;
dll123 = LoadLibrary("kingvewcliend.dll");
if (NULL == dll123)
printf("cant't find dll");
FARPROC msg1;
msg1 = GetProcAddress(dll123, "ReadItemNo");
if (NULL == msg1)
printf("cant't frind function");
else
a = msg1();
printf("%d/n",a);
}
在编译、链接、运行之前,一定要记着先把kingvewcliend.dll 文件拷贝到工程文件夹内。
(二)接下来,是实现调用kingvewcliend.dll 文件中的int StartCliend(char* node);
函数的方法:
与上面int ReadItemNo();函数不同的是,int StartCliend(char* node);函数带了参数,怎么
办呢?研究下下面的代码,你就明白了! :)
#include "stdio.h"
#include "windows.h"
void main()
{char b = 1;
int a;
typedef int (CALLBACK *myfun1)(char*);
HINSTANCE dll123;
dll123 = LoadLibrary("kingvewcliend.dll");
if (NULL == dll123)
printf("cant't find dll");
myfun1 msg1;
msg1 = (myfun1)GetProcAddress(dll123, "StartCliend");
if (NULL == msg1)
printf("cant't find function");
else
a = msg1(&b);
printf("%d/n",a);
}

原文出处:http://blog.csdn.net/children1987/archive/2009/12/01/4917764.aspx

VC6中调用.dll文件中的函数——傻瓜式教程相关推荐

  1. dll放在unity哪个文件夹下_unity中调用dll文件总结

    unity中调用dll文件总结 根据收集的资料,对unity中调用dll文件进行总结,目前常用的两种,在给出vs中封装dll文件的步骤. 一.调用c#中的dll文件 1.1封装dll文件 首先新建一个 ...

  2. java中调用dll文件的两种方法

    https://www.cnblogs.com/huozhong/p/5830485.html JNA地址:http://blog.csdn.net/shendl/article/details/35 ...

  3. matlab 查看dll的函数参数类型,MATLAB调用dll文件中的库函数时的变量类型匹配问题?...

    我用MATLAB调用dll来进行USB数据采集运行 libfunctions  USBAD -full 得到: Functions in library USBAD: [lib.pointer, vo ...

  4. java如何利用JNative调用dll文件

    下文参考自:http://blog.163.com/wex660@126/blog/static/2415306520103142363964/ 因为项目需要,用到了java调用dll文件中的方法.写 ...

  5. 【DLL】clion生成.dll文件、python调用.dll文件

    最近为了生成以及调用.dll文件,踩了一些雷,记录如下 目录 1.clion中生成.dll 2.clion中测试生成的.dll文件 3.在python中调用.dll文件 [1]导入.dll [2]ct ...

  6. VC如何调用DLL文件

    调用DLL,首先需要将DLL文件映像到用户进程的地址空间中,然后才能进行函数调用,这个函数和进程内部一般函数的调用方法相同.Windows提供了两种将DLL映像到进程地址空间的方法: 1. 隐式的加载 ...

  7. 天马行空W:在C++中调用DLL中的函数

    1.dll的优点 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用.比较常见的例子是各种应用程序框架,ATL.MFC等 ...

  8. 在C++中调用DLL中的函数

    1.dll的优点 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用.比较常见的例子是各种应用程序框架,ATL.MFC等 ...

  9. 在C++中调用DLL中的函数(2)

    本文转自:http://blog.sina.com.cn/s/blog_53004b4901009h3b.html 应用程序使用DLL可以采用两种方式: 一种是隐式链接,另一种是显式链接.在使用DLL ...

最新文章

  1. gevent queue应用1
  2. 经典的两数互换【指针】
  3. 关于知识图谱,各路大神最近都在读哪些论文?
  4. MySQL(5)---MySQL客户端工具的选择
  5. linux服务器上的cad病毒,Linux挖矿病毒的清除与分析
  6. 虚拟机安装linux输入密钥,远程连接虚拟机并做密钥认证
  7. win8计算机修改mac,快捷MAC地址修改器
  8. 用特征根判别法判断AR模型的平稳性,再用随机模拟的方法来验证以及做自相关分析
  9. 【IdeaVR2019快捷操作(三)】-基础功能小组协作使用介绍
  10. 阿里云域名解析成功后无法ping问题
  11. python实操实例100例_趣学Python算法100例
  12. 处理器CPU概念及CPU多线程
  13. Linux Shell字符串变量头尾去除空格
  14. 树莓派(七):调取IP摄像头
  15. FusionConpute虚拟机的发放与管理
  16. 精度、召回率、准确率、F1、ROC、AUC的理解
  17. python只读打开文件_关于python:只读文件的第一行?
  18. C++ Vjudge 训练题
  19. TextToSpeech_TTS开篇
  20. 阿里云ACP认证考试攻略及常见问题

热门文章

  1. 2018年计算机网络原理自考答案,揭秘:小小的人工耳蜗为何值20万?丢失后需要重新开颅植入?...
  2. 使用CsvReader读取和写入csv文件
  3. AMOLED Demura 烧录图像控制屏幕灯珠方式
  4. 乒乓球(table tenni)
  5. Raspberry Pi 4 Model B(4G RAM)WIndows 10 安装(SD挂载USB驱动)
  6. SAP CRM 开发学习资料和教程整理
  7. 东芝雾语冰箱京东发布 专利雾化保鲜科技突破行业壁垒
  8. php _initialize __construct,Thinkphp5 _initialize() 和 _construct() 中无法Return
  9. java中retain_瞬间教你学会使用java中list的retainAll方式
  10. 小而快目标的跟踪:学习记录