C/C++写dll文件

DLL即Dynamic Link Library(动态链接库)的缩写。什么是动态链接库

我用的codeblocks开发环境。

第一步创建一个动态链接库工程

FIle  > New > Project > Dynamic Link Library 创建完成后打开main.cpp编辑器会自动生成一段代码

#include "main.h"
// a sample exported function
void DLL_EXPORT SomeFunction(const LPCSTR sometext)
{
    MessageBoxA(0, sometext, "DLL Message", MB_OK | MB_ICONINFORMATION);
}
extern "C" DLL_EXPORT BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{

    switch (fdwReason)
    {
        case DLL_PROCESS_ATTACH:
            // attach to process
            // return FALSE to fail DLL load
            break;

        case DLL_PROCESS_DETACH:
            // detach from process
            break;

        case DLL_THREAD_ATTACH:
            // attach to thread
            break;

        case DLL_THREAD_DETACH:
            // detach from thread
            break;
    }
    return TRUE; // succesful
}
2、在main.cpp里写一个函数

#include "main.h"
// a sample exported function
void DLL_EXPORT SomeFunction(const LPCSTR sometext)
{
    MessageBoxA(0, sometext, "DLL Message", MB_OK | MB_ICONINFORMATION);
}
int DLL_EXPORT add(int a, int b)//这个是自己写的函数,用来返回a+b的值
{
    return a + b;
}
extern "C" DLL_EXPORT BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{

    switch (fdwReason)
    {
        case DLL_PROCESS_ATTACH:
            // attach to process
            // return FALSE to fail DLL load
            break;

        case DLL_PROCESS_DETACH:
            // detach from process
            break;

        case DLL_THREAD_ATTACH:
            // attach to thread
            break;

        case DLL_THREAD_DETACH:
            // detach from thread
            break;
    }
    return TRUE; // succesful
}
3、编辑器还自动生成了一个头文件

#ifndef __MAIN_H__
#define __MAIN_H__

#include <windows.h>

/*  To use this exported function of dll, include this header
 *  in your project.
 */

#ifdef BUILD_DLL
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT __declspec(dllimport)
#endif


#ifdef __cplusplus
extern "C"
{
#endif

void DLL_EXPORT SomeFunction(const LPCSTR sometext);
int DLL_EXPORT add(int a, int b);//这是add函数的声明
#ifdef __cplusplus
}
#endif

#endif // __MAIN_H__


要在头文件里声明一下自己写的函数。至于extern "C"是什么自己到博客园(吴秦)里看。

4、然后编译这两个文件,因为是dll文件所以无法独立运行。

5、新建一个控制台项目,将编译好的dll文件和头文件拷贝到新项目里,并引入头文件。

#include <iostream>
#include "main.h"
#include <windows.h>

int main()
{
    HMODULE h = NULL;//创建一个句柄h
    h = LoadLibrary("test.dll");
    if(h == NULL)//判断有没有加载test.dll
    {
        std::cout << "no test.dll";
        return 0;
    }
    typedef int (*func)(int, int);//定义函数指针类型
    func add = (func)GetProcAddress(h, "add");//获取名为add位函数的地址,如果没有此函数则返回NULL
    if(add == NULL)//判断是否获得函数地址
    {
        std::cout << "no add function";
        return 0;
    }
    std::cout << add(3, 4);
    FreeLibrary(h);//释放
    return 0;
}



这样写main函数即可调用。

6、贴上输出截图

这是完整调用,无错误。

无test.dll时调用


有test.dll没有add函数时调用




猜你喜欢

转载自blog.csdn.net/q916490090/article/details/78922283