windows系统下可执行程序调用lib静态库和dll动态库的方法

来源:互联网 发布:淘宝宝贝详情图片排放 编辑:程序博客网 时间:2024/04/26 01:22

1、windows系统下可执行程序调用lib静态库的方法

#pragma comment(lib,"Ws2_32.lib")//表示链接Ws2_32.lib这个库。
这种方法和在工程设置里写上链入Ws2_32.lib的效果一样,不过这种方法写的程序别人在使用你的代码的时候就不用再设置工程settings了。告诉连接器连接的时候要找ws2_32.lib,这样你就不用在linker的lib设置里指定这个lib了。

用法示例:
#include "Mwic_32.h"
#pragma comment(lib,"Mwic_32.lib")
包含对应的头文件和指定lib库,就不需要在project setting里面设置了,程序能自动引用Mwic_32.lib静态库文件。


2、windows系统下可执行程序调用dll动态库的方法。

dll 两种链接方式  : 动态链接和静态链接(链接亦称加载)

动态链接:指在生成可执行文件时不将所有程序用到的函数链接到一个文件,因为有许多函数在操作系统带的dll文件中,当程序运行时直接从操作系统中找。  动态链接是只建立一个引用的接口,而真正的代码和数据存放在另外的可执行模块中,在运行时再装入。
静态链接:就是把所有用到的函数全部链接到exe文件中。静态链接是把所有的代码和数据都复制到本模块中,运行时就不再需要库了。

(1)生成 : 
静态链接库 lib 和动态链接库 dll;
新建工程 (newdll)  win32项目 ->  dll;
添加*.h文件 ;
示例程序:
#ifndef BETABINLIB_H
#define BETABINLIB_H
 
#ifdef NEWDLL_EXPORTS   //自动添加的宏   右键工程-属性-配置属性-预处理器-..定义
#define MYDLL_API extern "C" __declspec(dllexport)
#else
#define MYDLL_API extern "C" __declspec(dllimport)
#endif
 
MYDLL_API int add(int x, int y);  // 必须加前缀

#endif

添加*.cpp文件;
示例程序:
#include "stdafx.h"
#include "betabinlib.h"
 
int add(int x, int y)
{
    return x + y;
}
编译生成  .dll 和 .lib文件。

(2)使用:
方法一:dll的静态加载--将整个dll文件 加载到 .exe文件中;
特点:程序较大,占用内存较大,但速度较快(免去调用函数LOADLIB等)
测试:
需要文件:  .lib  和 .dll两个文件 (.lib 做 引导用),.h文件
示例程序:
#include <stdio.h>
#include <Windows.h>
#include "betabinlib.h"
#pragma comment(lib, "newdll.lib")

 
int main()
{
    printf("2 + 3 = %d \n", add(2, 3));
    return 0;
}

方法二:dll的动态加载--根据需要加载响应函数,随时可卸载。不会因为找不到dll, 导致程序不能运行(需要自己做判断处理)。
只需要 .lib文件,不需要 .h文件。
#include <stdio.h>
#include <Windows.h>
 
int main()
{
    HINSTANCE h=LoadLibraryA("newdll.dll");
    typedef int (* FunPtr)(int a,int b);//定义函数指针

 
    if(h == NULL)
    {
    FreeLibrary(h);
    printf("load lib error\n");
    }
    else
    {
        FunPtr funPtr = (FunPtr)GetProcAddress(h,"add");
        if(funPtr != NULL)
        {
            int result = funPtr(3, 3);
            printf("3 + 3 = %d \n", result);

        }
        else
        {
            printf("get process error\n");
            printf("%d",GetLastError());
        }
        FreeLibrary(h);
    }
 
    return 0;
}




0 0