1.设置程序管理员启动方式启动
2.设置.dll与.lib生成目录
vs2008中,有些项目上的功能是要生产库文件给其他项目调用的,以下是一些设置库文件(x.dll和x.lib)输出路径的方法.
设置x.dll 输出路径方法是在右键项目的"属性"->连接器->常规, 然后在常规属性界面中的 "输出文件" 中填入自己想要x.dll文件的输出路径.
设置x.lib 输出路径方法是在右键项目的"属性"->连接器->高级, 然后在高级属性界面中的 "导入库" 项中填入自己想要x.dll文件的输出路径.
但是在设置x.lib的输出路径时,发现如果你输入的路径中有某个文件夹不存在,那么文件会生成失败,并且提示无法链接到导入库项路径中的lib库.
解决这个问题的方法是保证你设置的路径上每个文件夹都是存在的。如果不存在,就手动创建。
经过测试发现设置x.dll的路径时,如果输入的路径中即使有某个文件夹不存在,编译器会自动给我们生成,并不会出现x.lib设置的情况。
3.编写dll程序的头文件预定义
这边给一个简单的例子:
#ifndef _JN_COLLECT_DATA_MODBUSTCP_INTERFACE_H_
#define _JN_COLLECT_DATA_MODBUSTCP_INTERFACE_H_
//---------------------------------------------------------
#include "JnCollectDataBase.h"
//---------------------------------------------------------
#ifdef JNCOLLECTDATA_MODBUSTCP_EXPORTS
#define JN_MODBUSTCP_API __declspec(dllexport)
#else
#define JN_MODBUSTCP_API __declspec(dllimport)
#endif
#define JN_MODBUSTCP_CALL __stdcall
//---------------------------------------------------------
/**
* 取得采集兼容实例
* @return =CCollectDataBase& 采集兼容实例引用
*/
JN_MODBUSTCP_API CCollectDataBase& JN_MODBUSTCP_CALL JNCSI_GetInstance_ModbusTcp();
//---------------------------------------------------------
#endif /* _JN_COLLECT_DATA_MODBUSTCP_INTERFACE_H_ */
#include "JnCollectData_ModbusTcpInterface.h"
#include "JnCollectData_ModbusTcp.h"
JN_MODBUSTCP_API CCollectDataBase& JN_MODBUSTCP_CALL JNCSI_GetInstance_ModbusTcp()
{
return CCollectData_ModbusTcp::GetInstance();
}
#ifdef __cplusplus
extern "C" {
#endif
//SDKs
#ifdef __cplusplus
} /* extern "C" */
#endif
4.隐式调用.dll的API
隐式链接采用静态加载的方式,比较简单,需要.h、.lib、.dll三件套。。
新建“控制台应用程序”或“空项目”配置如下:(非常关键)
项目->属性->配置属性->VC++ 目录-> 在“包含目录”里添加头文件.h所在的目录
项目->属性->配置属性->VC++ 目录-> 在“库目录”里添加头文件.lib所在的目录
项目->属性->配置属性->链接器->输入-> 在“附加依赖项”里添加“.lib”(若有多个 lib 则以空格隔开)还需要将.dll复制到当前项目生成的可执行文件所在的目录。
代码加载库
#pragma comment(lib,"ws2_32.lib")
5.字符对齐
#pragma pack(1)