软件版本: VC6.0
操作系统: Windows7


动态库开发:

1.VC6.0环境下新建“Win32 Dynamic-Link Library”工程(工程名为mydll)
2.添加如下代码

#include <stdio.h>

extern "C" _declspec(dllexport) void dprint(void)
{
    printf("Hello World.\r\n");
}

3.保存并编译后,会在相关目录下产生mydll.dll和mydll.lib两个文件;

注意事项:
函数声明中一定要包含extern "C"关键字,否则导出后可能不能常使用.


动态库Banner
BOOL WINAPI DllMain( HANDLE hModule,
                     DWORD  reason,
                     LPVOID lpReserved ) 
{
    if(reason)
    {
        printf("加载动态库\r\n");
    }
    else
    {
        printf("卸载动态库\r\n");
    }
    return TRUE;
}

该函数在动态库被加载(reason=1)和卸载(reason=0)时自动调用;


动态库应用(方案一 动态调用):

1.新建一个应用工程,例如“Win32 Console Application”
2.将mydll.dll文件复制到工程目录下
3.添加如下代码:

#include <Windows.h>

typedef void(*pfun)(void);    //函数指针

int main(int argc, char* argv[])
{
    HINSTANCE hDLL;
    pfun dp;

    hDLL=LoadLibrary("mydll.dll"); //加载 DLL文件
    if(hDLL == NULL)
    {
        //加载动态库失败
        return -1;
    }

     dp = (pfun)GetProcAddress(hDLL,"dprint"); //取DLL中的函数地址
     if(dp != NULL)
     {
         dp();
     }
}

4.将mydll.dll文件复制至可执行文件目录下即可

注意事项:
一定要加入Windows.h头文件
方法一适用于VC6.0和BCB


动态库应用(方案二 静态调用):
1.新建一个应用工程
2.将mydll.dll和mydll.lib文件复制到工程目录下(重要)

#pragma comment(lib, "mydll.lib")
extern "C" _declspec(dllimport) void dprint(void);    //导出

int main(int argc, char* argv[])
{
    dprint();
}

注意事项:
1.如果不指定extern "C" 可能会造成编译错误;
2.可以将导出函数定义在mydll.h文件中;
3.进行静态调用,编译时需要提供lib文件(BCB需对lib文件进行转换);
转换命令:coff2omf -lib:ms usbrd32_win.lib bcb usbrd32_bcb.lib
4.即使静态调用,运行时依然需依赖于dll文件;


基于C#的动态库调用
//引用头文件
using System.Runtime.InteropServices;

//导入函数
[DllImport("mydll.dll",
EntryPoint = "GetDllVersion",
CallingConvention = CallingConvention.StdCall)]
public static extern String GetDllVersion();

//应用
GetDllVersion();

注意事项:
1.导出函数第一个参数是动态库名称
2.导出函数必须用static extern关键字修饰;