为自己的dll生成版本号
调用api获取版本号
上代码:
#include <tchar.h>
#include <windows.h>
#include <winver.h>
#define DLL_VERSION_LENGTH 32
// Load version lib
#ifdef WIN10
#pragma comment(lib, "Mincore.lib")
#else
#pragma comment(lib, "version.lib")
#endif
typedef struct
{
bool is_set;
char dll_version_string[DLL_VERSION_LENGTH];
} dll_version_record_t;
// 获取的版本号保存在全局变量中
static dll_version_record_t dll_version_record = {0, 0};
static char* get_local_program_version(void)
{
TCHAR file_path[MAX_PATH] = {0};
HMODULE hodule_handle = GetModuleHandle(_T("xxx.dll")); ///<将xxx.dll改为自己想要获取的dll
LPVOID lp_buff = NULL;
UINT uLen = 0;
TCHAR* lp_data = NULL;
DWORD dw_size = 0;
int len = 0;
char* ch_rtn = NULL;
DWORD ret = 0;
ret = GetModuleFileName(hodule_handle, file_path, MAX_PATH);
if (ret == 0)
{
return NULL;
}
//获取版本信息大小
dw_size = GetFileVersionInfoSize(file_path, NULL);
if (dw_size == 0)
{
return NULL;
}
lp_data = (TCHAR*) malloc(dw_size + 1);
if (lp_data == NULL)
{
return NULL;
}
memset(lp_data, 0, dw_size + 1);
//获取版本信息
ret = GetFileVersionInfo(file_path, NULL, dw_size, lp_data);
if (ret == 0)
{
return NULL;
}
ret = VerQueryValue(lp_data, TEXT("\\StringFileInfo\\080404b0\\ProductVersion"), &lp_buff, &uLen); ///<对应Resource.rc中设置的ProductVersion
if (ret == 0)
{
free(lp_data);
lp_data = NULL;
return NULL;
}
len = 2 * wcslen((TCHAR*) lp_buff); // CString,TCHAR汉字算一个字符,因此不用普通计算长度
ch_rtn = (char*) malloc(len + 1);
if (ch_rtn == NULL)
{
return NULL;
}
memset(ch_rtn, 0, len + 1);
wcstombs(ch_rtn, (TCHAR*) lp_buff, len + 1); //转换成功返回为非负值
strcpy(dll_version_record.dll_version_string, ch_rtn);
dll_version_record.is_set = TRUE;
free(lp_data);
lp_data = NULL;
free(ch_rtn);
ch_rtn = NULL;
return dll_version_record.dll_version_string;
}
参考: VC获得程序自身的版本号