动态链接库DLL导出函数并导入使用

本文完全参考自《vs2008制作dll笔记,回带值样例》。

首先制作DLL文件,在vs2010中新建Win32控制台项目,选择DLL选项,简历头文件,源文件如下:

头文件:

// MyDll.h
extern "C" _declspec(dllexport) int Max(int a, int b);
extern "C" _declspec(dllexport) int Min(int a, int b);
extern "C" _declspec(dllexport) bool cim2scada(char* cimId, char** scadaId);

源文件:

// MyDll.cpp : Defines the exported functions for the DLL application.
// #include "MyDll.h"
#include <iostream> int Max(int a, int b)
{
if (a >= b)
{
return a;
}
else
{
return b;
}
} int Min(int a, int b)
{
if (a >= b)
{
return b;
}
else
{
return a;
}
} bool cim2scada(char* cimId, char** scadaId)
{
char* result;
if (cimId == NULL)
{
printf("空指针!");
return false;
}
else if (strlen(cimId) == )
{
printf("cimId无值!");
return false;
} if (strcmp(cimId, "aaaaaa") == )
{
result = "";
}
else if (strcmp(cimId, "bbbbbb"))
{
result = "";
} *scadaId = result;
printf("fun scadaId: %s \n", *scadaId);
return true;
}

然后,创建测试样例,重新简历Win32控制台程序,选择控制台选项,建立测试代码:

#include "windows.h"
#include <iostream> int main()
{
typedef int (*pMax)(int a, int b);
typedef int (*pMin)(int a, int b);
typedef bool (*pcim2scada)(char* cimid, char** scada); HINSTANCE HDLL;
HDLL = LoadLibrary(L"MyDll.dll"); // 加载动态链接库MyDll.dll文件;
pMax Max = (pMax)GetProcAddress(HDLL, "Max");
pMin Min = (pMin)GetProcAddress(HDLL, "Min");
pcim2scada cim2scada = (pcim2scada)GetProcAddress(HDLL, "cim2scada"); int a = Max(, );
char* cimId = "aaaaaa";
char* scadaId = "";
bool b = cim2scada(cimId, &scadaId); printf("Max结果为%d\n", a);
printf("cimId:%s, scadaId:%s\n", cimId, scadaId); FreeLibrary(HDLL); // 卸载MyDll.dll文件
}

编译生成Debug文件夹,讲之前生成的Dll文件拷贝到该Debug文件夹中,然后运行该测试样例。

DLL导出并导入生成函数需要注意几点:

         extern "C" _declspec(dllexport)

 

         typedef int (*pMax)(int a, int b);

         typedef int (*pMin)(int a, int b);

         typedef bool (*pcim2scada)(char* cimid, char** scada);

         HINSTANCE HDLL;

         HDLL = LoadLibrary(L"MyDll.dll"); // 加载动态链接库MyDll.dll文件;

         pMax Max = (pMax)GetProcAddress(HDLL, "Max");

         pMin Min = (pMin)GetProcAddress(HDLL, "Min");

         pcim2scada cim2scada = (pcim2scada)GetProcAddress(HDLL, "cim2scada");

         接下来,将学习如何用DLL导出C++类、对象,并进行导入使用。

动态链接库DLL导出函数并导入使用的更多相关文章

  1. DLL导出函数和类的定义区别 __declspec(dllexport)

    DLL导出函数和类的定义区别 __declspec(dllexport) 是有区别的, 请看 : //定义头文件的使用方,是导出还是导入 #if defined(_DLL_API) #ifndef D ...

  2. dll 导出函数名的那些事

    dll 导出函数名的那些事 关键字: VC++  DLL  导出函数 经常使用VC6的Dependency或者是Depends工具查看DLL导出函数的名字,会发现有DLL导出函数的名字有时大不相同,导 ...

  3. C# 遍历DLL导出函数

    C#如何去遍历一个由C++或E语言编写的本地DLL导出函数呢 不过在这里我建议对PE一无所知的人 你或许应先补补这方面的知识,我不知道为什么PE方面的 应用在C#中怎么这么少,我查阅过相关 C#的知识 ...

  4. dll导出函数的两种方式的比较

    最初的网页链接已经挂了, 在此贴一个中间的转载链接 https://blog.csdn.net/zhazhiqiang/article/details/51577523 一 概要 vs中导出 dll的 ...

  5. Dll 导出函数那些破事

    经常使用VC6的Dependency查看DLL导出函数的名字,会发现有DLL导出函数的名字有时大不相同,导致不同的原因大多是和编译DLL时候指定DLL导出函数的界定符有关系. VC++支持两种语言:即 ...

  6. AFX_MANAGE_STATE(AfxGetStaticModuleState())DLL导出函数包含MFC资源

    AFX_MANAGE_STATE(AfxGetStaticModuleState()) 先看一个例子: .创建一个动态链接到MFC DLL的规则DLL,其内部包含一个对话框资源.指定该对话框ID如下: ...

  7. 使用dumpbin命令查看dll导出函数及重定向输出到文件【轉】

    查看dll导出函数,一般使用Viewdll等第三方工具. VS开发环境中,可以查看32位和64位的dll.具体使用方法如下: 1. 进入VS开发环境,然后Tools -> Visual stud ...

  8. 使用dumpbin命令查看dll导出函数及重定向输出到文件(VS自带)

    以前查看dll导出函数,一般使用Viewdll等第三方工具.但由于Viewdll采用dephi编写,因此仅能查看32位的dll.其实微软已经帮我们提供一个查看dll导出函数的命令,嵌在VS开发环境中, ...

  9. DLL导出函数

    使用DEF文件从DLL导出 模块定义(.def)文件时包含一个或多个描述DLL各种属性的Module语句的文本文件.如果不使用_declspec(dllexport)关键字导出DLL的函数,则DLL需 ...

随机推荐

  1. 前端三大框架之一React入门教程

    相信大家对框架这个词都很熟悉吧,我一直喜欢js原生来开发,但是目前都要求工作效率,所有使用框架或者是库会使我们开发更加方便和快速,甚至一个人干十个人的活.. 框架优点: 1.方便开发.快速写功能 2. ...

  2. openlayers/// Puppeteer.js

    1.定位;https://viglino.github.io/ol3-ext/examples/map.interaction.geolocationdraw.html 2 .添加Overlay  d ...

  3. springMVC :interceptors

    1.配置拦截器 在springMVC.xml配置文件增加:     <mvc:interceptors>    <!-- 日志拦截器 -->    <mvc:interc ...

  4. mysql 在登陆的时候出现error 1045 (28000): 错误解决办法

    错误显示:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) 解决方案: 1.找到配 ...

  5. express 中间件

    [express 中间件] 中间件(Middleware) 是一个函数,它可以访问请求对象(request object (req)), 响应对象(response object (res)), 和 ...

  6. 关于订单BOM替换组件不成功的问题

    替换成功的案例: SELECT * FROM IN_BOM_DETAILS WHERE BOM_ID='00161815_2023_01P19'; --成品编码:000000101011006433P ...

  7. rsync+inotify实现数据实时同步

    rsync rsync是linux系统下的数据镜像备份工具.支持远程同步,本地复制,或者与其他SSH.rsync主机同步. 优点: 1).可以镜像保存整个目录树和文件系统.保存源目录整个目录树和文件系 ...

  8. Numpy:ndarray数据类型和运算

    Numpy的ndarray:一种多维数组对象 N维数组对象,该对象是一个快速而灵活的大数据集容器,nadarry是一个通用的同构数据多维容器,也就是说,其中的所有元素必须是相同类型的.每个数组都有一个 ...

  9. CentOS 下lvm 磁盘扩容

    打算给系统装一个oracle,发现磁盘空间不足.在安装系统的时候我选择的是自动分区,系统就会自动以LVM的方式分区.为了保证系统后期的可用性,建议所有新系统安装都采用LVM,之后生产上的设备我也打算这 ...

  10. NumPy 高级索引

    NumPy 高级索引 NumPy 比一般的 Python 序列提供更多的索引方式.除了之前看到的用整数和切片的索引外,数组可以由整数数组索引.布尔索引及花式索引. 整数数组索引 以下实例获取数组中(0 ...