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


    动态链接库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) == 0)
        {
            printf("cimId无值!");
            return false;
        }
    
        if (strcmp(cimId, "aaaaaa") == 0)
        {
            result = "1000";
        }
        else if (strcmp(cimId, "bbbbbb"))
        {
            result = "2000";
        }
    
        *scadaId = result;
        printf("fun scadaId: %s 
    ", *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(5, 12);
        char* cimId = "aaaaaa";
        char* scadaId = "";
        bool b = cim2scada(cimId, &scadaId);
    
        printf("Max结果为%d
    ", a);
        printf("cimId:%s, scadaId:%s
    ", 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++类、对象,并进行导入使用。

  • 相关阅读:
    Docker--使用
    腾讯云发送短信
    Mysql--查询基础
    flask10--数据库链接池(通用),wtforms
    Flask11--Flask-script,sqlalchemy
    序列化 json
    第五章-算术运算符
    计算机网络自顶向下的方法-第二章 应用层
    第三章-数据类型
    第三章-常量和宏定义
  • 原文地址:https://www.cnblogs.com/unixfy/p/3240162.html
Copyright © 2020-2023  润新知