一、首先,使用vs2008创建windows32控制台程序,选择dll复选框,确定。
然后在stdafx.h头文件中声明导出函数,举例如下
__declspec(dllexport) int add(int a ,int b);//add是函数名,可声明多个
__declspec(dllexport) int sub(int a ,int b);
如果创建的是C++工程则需要在函数声明前加上extern "C"
变成: extern "C" __declspec(dllexport) int add(int a ,int b);
extern "C" __declspec(dllexport) int sub(int a ,int b);
接着在你创建的C文件中实现上述函数体,如下
int __declspec(dllexport) add(int a ,int b)
{
return a+b;
}
int __declspec(dllexport) sub(int a,int b)
{
return a-b;
}
这个是C++中,如果仅仅使用一个c文件实现dll,举例如下
#include <windows.h>
__declspec(dllexport) int add(int a ,int b);
__declspec(dllexport) int sub(int a ,int b);
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}//这段代码c++工程自动生成
__declspec(dllexport) int add(int a ,int b)
{
return a+b;
}
int __declspec(dllexport) sub(int a,int b)
{
return a-b;
}
二、C调用dll
在创建一个新的工程。把之前生成的dll文件拷贝入调用工程的debug文件夹下。如果想方便,就顺便把lib文件也拷贝到debug下,因为三要用。键入如下代码:
#include<stdio.h>
#include <windows.h>
int main()
{
typedef int (*ADD)(int ,int);//函数指针类型
HINSTANCE Hint = LoadLibrary("adddll.dll");//加载我们刚才生成的dll
ADD add = (ADD)GetProcAddress(Hint,"add");//取得dll导出的add方法
printf("%d",add(3,4));
return 0;
}
当提示错误error C2664: “LoadLibraryW”: 不能将参数 1 从“const char [13]”转换为“LPCWSTR” 时,需要步骤三。
三、C调用lib,
把上述工程生成的lib文件拷入建立的工程下,然后在代码中加入如下语句
#pragma comment(lib,"adddllcpp.lib")
extern int add(int ,int);//没有加这句而只加上面这句(或在工程设置里加上DLL.lib)会链接错误
extern int sub(int ,int);
注意:工程属性字符集必须改成“使用多字节字符集”。