将功能写在Dll中在控制台中调用

//源文件中代码

#include "pch.h"

#include "cl1.h"

#include "stdio.h"//File需要引用的文件不然不能够给它一个指针(File* file;)

extern "C"
{
    int Add(int a, int b)//加法函数
    {
        return a + b;
    }
}


int Sub(int a, int b) //减法函数
{
    return a-b;
}
 


 extern "C" 
 {
     void Write_file()
     {
         char cA[] = { 'a','b','c','d','1','2','3' };//字符数组(需要写入的)
         FILE* fp;//文件指针
         fp = fopen("D:\\test1.txt", "w");//打开文件,w是写入,"D:\\test1.txt"被打开的文件名(写入字符的位置)
         if (fp == nullptr)//如果写入的文件为空
         {
             printf("未找到此文件");
         }
         else如果写入的文件不为空
         {
             for (int i = 0;i < 7;i++)//循环数组取值
             {

                 fprintf(fp, "%c", cA[i]);
                 printf("%c\n", cA[i]);
             }
             fclose(fp);//关闭文件指针(必须要)
         }

     }
 }


 extern "C"
 {
     void wei(char* cA)//给一个字符串的有参函数
     {
         FILE* fp;
         fp = fopen("D:\\test1.txt", "w");
         if (fp == nullptr)
         {
             printf("未找到此文件");
         }
         else
         {
                 fprintf(fp, "%s",cA);//%s是整个字符串
             fclose(fp);
         }

     }
 }

头文件中代码

//宏定义导出
#ifdef MyDLL_d//如果没有定义DLLH就定义 DLLH _declspec(dllexport)
#define BHDLL _declspec(dllexport)//导出//BHDLL为我所定义的宏(可以自己命名)
#else
#define BHDLL _declspec(dllimport)//导出
#endif  //DLLH_ 如果没有定义DLLH 就定义DLLH
#endif
//导出函数
extern "C"
{
    BHDLL int Add(int a, int b);//声明加法函数
}

BHDLL int Sub(int a, int b);//声明减法函数
 

extern "C" 
{
    BHDLL void Write_file();//声明写入文件的函数
}
extern "C"
{
    BHDLL void Write_filechar(char* cA);//声明带参的写入文件函数
}

//控制台程序中

//LoadLibrary函数加载dll

HMODULE hModule = LoadLibrary("D:\\Users\\Administrator\\source\\repos\\Dll2\\Debug\\Dll2.dll");//dll的地址D:\\Users\\Administrator\\source\\repos\\Dll2\\Debug\\Dll2.dll(绝对路径)
    if (hModule != NULL) 
    {
        //处理错误
    }

typedef int(*MyDLL)(int,int);//给的指针
    MyDLL myDll = (MyDLL)GetProcAddress(hModule, "Add");//DLL里面的函数方法Add的调用
     
   if (myDll == NULL)//得到的指针为空
     {
        printf("add is null\n");
    }
   if (myDll)//得到的指针不为空
     {
        int nD = myDll(4, 5);//add函数的add(int a,int b)对应了add(4,5)
        printf("%d\n", nD);
     }
    //动态链接库的调用(动态调用都需要dll文件)

typedef int(*MyDll)(char  cDa);//给的指针    

MyDll mydll = (MyDll)GetProcAddress(hModule, "Write_file");//文件写入的函数

if (mydll == NULL) //指针为空
    {
        printf("文件未写入");
    }
    if (mydll)
    {
        mydll((char*)"abc");
        printf("文件已写入");
    }

//带参数的文件写入(如果需要安全性高一点可以在后面加一个size(大小)去限制)

typedef int(*MyDLl)(char  *cAa);//给的指针  
    MyDLl myDLl = (MyDLl)GetProcAddress(hModule, "Write_filechar");//文件写入的带参函数
    if (myDLl == NULL) //指针为空
    {
        printf("文件未写入");
    }
    if (myDLl)
    {
        myDLl((char*)"abc");
        printf("文件已写入");
    }

   int m = Add(2, 4);//静态链接库的加法函数(要引用lib文件)

     printf("%d\n", m);
   int w = Sub(7,3);//静态链接库的减法函数(要引用lib文件,静态调用都要lib文件)
    printf("%d\n", w);
  printf("pause");
   return 0;
}

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在Qt控制台应用程序调用DLL,你可以按照以下步骤进行操作: 1. 将DLL文件放置在Qt项目的文件夹,或者指定其绝对路径。 2. 在Qt项目创建一个头文件(例如,dllwrapper.h),用于声明要调用DLL函数的函数指针和相关数据结构。 3. 在dllwrapper.h文件,使用`#include`指令包含DLL的头文件。如果DLL没有提供头文件,则需要自己编函数的声明。 4. 在dllwrapper.h文件,声明函数指针来存储DLL函数的地址。例如,如果要调用名为`MyFunction`的函数,则可以使用以下代码声明函数指针: ```cpp typedef int (*MyFunctionType)(int); ``` 5. 在dllwrapper.h文件,创建一个类或命名空间来管理DLL函数的加载和调用。在类或命名空间,添加一个静态成员函数用于加载DLL并获取函数地址。例如: ```cpp class DLLWrapper { public: static bool loadDLL(); static MyFunctionType myFunction; }; ``` 6. 在dllwrapper.cpp文件实现`loadDLL`和其他函数。`loadDLL`函数,使用`QLibrary`类来加载DLL并获取函数地址。例如: ```cpp bool DLLWrapper::loadDLL() { QLibrary dll("your_dll_name.dll"); if (dll.load()) { myFunction = (MyFunctionType)dll.resolve("MyFunction"); if (myFunction) { return true; } } return false; } ``` 7. 在主函数或其他需要调用DLL函数的地方,调用`loadDLL`函数来加载DLL。例如: ```cpp if (DLLWrapper::loadDLL()) { int result = DLLWrapper::myFunction(42); // 处理DLL函数的返回值 } else { // 处理加载DLL失败的情况 } ``` 这样,你就可以在Qt控制台应用程序成功调用DLL函数了。请注意,上述示例代码仅作为演示,你需要根据实际情况进行修改和适配。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值