- 普通C封装成DLL:win32 DLL
- MFC 规则DLL《静态版、动态版》:只能导出自己的C++类
- MFC 扩展DLL《动态版》: 能够导出MFC类,C++类
头文件:
- const char* g-szWorld;只声明不定义,避免多次包含后产生Bug;
- 函数声明为extern 为外部定义
- 纯C输出:extern "C" 就是不改编函数名; 不能修饰类成员函数,且调用方式不能改变(C的调用约定)(vc是stdcall pascal的调用约定)
- 尽量避免头文件包含头文件,cpp中包含,h中 class A 申明
- 跨平台写法:define
- 可多次包含的声明(函数声明,类定义,数值常量)
#ifndef INCLUDED_LIB3DS_H //预处理变量名
#define INCLUDED_LIB3DS_H
//头文件中申明,不定义;
//类, const 常初始化,inline函数
//其他均extern BaiDu"如何定义头文件"
#ifndef LIB3DSAPI
#ifdef _MSC_VER
#ifdef LIB3DS_EXPORTS
#define LIB3DSAPI __declspec(dllexport)//DLL制作中include,表明这些是要导出的,提供给其他模块用的! 制作DLL要提前包含
#else
#define LIB3DSAPI __declspec(dllimport)//在自己程序中include,表明是由DLL提供
#endif
#else
#define LIB3DSAPI
#endif
#endif
#ifdef __cplusplus
extern "C" {
#endif
extern LIB3DSAPI void lib3ds_file_create_nodes_for_meshes(Lib3dsFile *file);//在其他C文件里有过定义
extern LIB3DSAPI void lib3ds_matrix_rotate_quat(float m[4][4], float q[4]);
extern LIB3DSAPI void lib3ds_matrix_rotate(float m[4][4], float angle, float ax, float ay, float az);
extern LIB3DSAPI void lib3ds_matrix_camera(float m[4][4], float pos[3], float tgt[3], float roll);
#ifdef __cplusplus
}
#endif
#endif
//跨平台定义:
#ifdef WIN32
#define THREADCREATE(func,argc,thread,id)\
thread=(HANDLE)-beginthreadex(...);
#else
#define THREADCREATE(func,argc,thread,id)\
pthread_create();
#endif
DLL导出:
#include "..\\bin\\NetSdk.h"
#pragma comment (lib,"..\\bin\\NetSdk")
同级目录:
#include "bin\lib3ds.h"
#pragma comment (lib,"bin\\lib3ds")
上级目录:..
DLL的变量,如果希望每个使用DLL的线程都有自己的值,则应该使用线程局部存储(TLS,Thread
Local Strorage)。
一个MFC DLL的Example
1、在VS中新建MFC DLL工程。
2、建立对话框-声成相关类等等,和MFC编程无异。
3、接口文件的编写,这里是重点。
--------------------------------------------------------------
3.1、建立itface.h和itface.cpp两个文件并加入到工程中
3.2、itface.h的实现代码如下:
#ifdef DLL1_API
#else
#define DLL1_API extern "C" __declspec(dllimport)
#endif
DLL1_API showDlg();
3.3、itface.cpp实现代码如下
#define DLL1_API extern "C" __declspec(dllexport)
#include "stdafx.h"
#include "TestDlg.h"
#include "itface.h"//注意这里的预编译顺序
void showDlg()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CTestDlg dlg;
dlg.DoModal();
}
3.4、编译完成后,切记用dependency工具查看dll函数是否导出。
-------------------------------------------------------------------------
4、建立测试程序,向测试程序提供三个文件,itface.h/dll/lib,然后在程序中实现如下代码
#pragma comment(lib,"mfcDll.lib")//声明lib文件
#include "itface.h"
之后,就可以在此源文件中任意调用itface.h内声明的接口函数。