眼过千遍不如手过一遍——简单动态链接库的编写
2010-10-26 16:30
399 查看
链接库文件TestDLL.h
链接库文件TestDLL.cpp
测试链接文件testlink.cpp
输出结果:
160
在TestDLL中再创建DLLMAIN函数如下:
则输出结果为:
process attach of dll
160
process detach of dll
以上是动态调用(程序在需要的时候再加载所需要的DLL,此种用法比较灵活)
再来看下静态调用,与动态调用不同的是,此种调用在程序编译时就将DLL的加载信息LIB编译进EXE中,当应用程序需要时便从相应的LIB文件中取得DLL的信息来加载DLL,通过符号名来实现对DLL函数的动态链接,与调用内部函数没有区别!
将调用函数testlink.cpp改写成这样:
预期输出结果为
process attach of dll
160
process detach of dll
但编译时出现1个警告:inconsistent dll linkage. dllexport assumed. 未出现错误
而执行时提示:无法启动应用程序,因为计算机中丢失TestDLL.dll
具体原因未知,待以后解开.....
#pragma once extern "c" int _declspec(dllexport)add(int ,int);//注意这里不能是_stdcall,否则编译出错,具体原因我也不知呀!
链接库文件TestDLL.cpp
#include "TestDLL.h" int add(int a,int b) { return a+b; }
测试链接文件testlink.cpp
#include<iostream> #include<windows.h> typedef (*inport)(int ,int ); int main() { HINSTANCE hdll; //dll句柄 inport addnew; //新函数指针 hdll=LoadLibrary(".../TestDLL.dll"); if(hdll==NULL) { std::cout<<"load dll error!"<<std::endl; } addnew=(inport)GetProcAddress(hdll,"add"); std::cout<<addnew(100,60)<<std::endl; return 0; }
输出结果:
160
在TestDLL中再创建DLLMAIN函数如下:
#include <iostream> #include <windows.h> using namespace std; bool APIENTRY DllMain(HANDLE hMoudole,DWORD ul_reason_for_call,LPVOID lpReserved) { switch(ul_reason_for_call) { case DLL_PROCESS_ATTACH: cout<<"process attach of dll"<<endl; break; case DLL_THREAD_ATTACH: cout<<"thread attach of dll"<<endl; break; case DLL_THREAD_DETACH: cout<<"thread detach of dll"<<endl; break; case DLL_PROCESS_DETACH: cout<<"process detach of dll"<<endl; } return true; }
则输出结果为:
process attach of dll
160
process detach of dll
以上是动态调用(程序在需要的时候再加载所需要的DLL,此种用法比较灵活)
再来看下静态调用,与动态调用不同的是,此种调用在程序编译时就将DLL的加载信息LIB编译进EXE中,当应用程序需要时便从相应的LIB文件中取得DLL的信息来加载DLL,通过符号名来实现对DLL函数的动态链接,与调用内部函数没有区别!
将调用函数testlink.cpp改写成这样:
#include <iostream> #include <windows.h> #include "F:/学习资料/C++编程/TestDLL/TestDLL.h" #pragma comment(lib,"F://学习资料//C++编程//TestDLL//Debug//TestDLL.lib") extern "C" int _declspec(dllimport)add(int a,int b); int main() { std::cout<<add(100,60)<<std::endl; return 0; }
预期输出结果为
process attach of dll
160
process detach of dll
但编译时出现1个警告:inconsistent dll linkage. dllexport assumed. 未出现错误
而执行时提示:无法启动应用程序,因为计算机中丢失TestDLL.dll
具体原因未知,待以后解开.....
相关文章推荐
- 眼过千遍不如手过一遍——简单动态链接库的编写
- Linux下编写简单的动态链接库
- 简单Demo:动态调用自己编写的动态链接库
- 使用c++开发excel插件 (3.4、编写一个简单的动态链接库)
- Linux下编写简单的动态链接库
- 眼过千遍不如手过一遍——静态链接库的编写
- 简单 Demo:C++编写、调用动态链接库
- Java调用C/C++编写的第三方dll动态链接库
- C++ builder调用vc编写的动态链接库的方法
- win32编写动态链接库注意事项
- VS2010编写动态链接库dll、使用dll 和 调试dll
- 怎样用VB编写.DLL动态链接库文件
- 使用python 编写 抓取内涵段子动态图的简单爬虫
- 编写简单的连接MongoDB数据库C++程序 && 解决编译C++程序时链接MongoDB动态库失败的问题
- linux下Makefile中包含有shared library动态链接库文件时候的简单例子
- 眼过千遍不如手过一遍——做MFC规则的可共享(shared)DLL
- 编写简单DLL及CL编译链接
- linux简单实现静态链接和动态链接
- 怎样用VB编写.DLL动态链接库文件
- 怎样用VB编写.DLL动态链接库文件