Windows上在DLL中嵌入自定义文件(如:xml文件)
1、前言
最近都在开发适配Genicam项目,在开发CTI(Windows上可以看作DLL)时发现需要将多个XML文件嵌入到DLL文件中方便内部代码调用。
2、前期准备
- 一个xml文件
- Visual Studio 2017 IDE
3、操作方式
创建一个DLL项目,在“资源文件” -> “添加” -> “资源”,便会生成一个<项目名>.rc文件,使用资源视图打开
右击“xmlindlldemo.rc” -> 添加资源 -> “导入” -> “右下角选择所有文件” -> “打开xml文件”
导入后会弹出一个“自定义资源类型”对话框,在类型中填入“RCDATA”即可。
这是“资源视图”如下:
右击“IDR_RCDATA1” -> 选择"资源符号"
可以取到XML资源的值为101
4、代码访问XML资源实现
char* ReadXML() {
// g_hModule为当前DLL的全局句柄
HINSTANCE hInstance = g_hModule;
// 使用FindResource根据上面找到的资源值(101)查找资源
// 注:这里的资源值请使用自己具体的资源值
HRSRC hResource = FindResource(hInstance, MAKEINTRESOURCE(101), RT_RCDATA);
if (hResource == NULL) {
std::cerr << "Failed to find XML resource: " << xmlFileName << std::endl;
return nullptr;
}
// 获取XML的内容
HGLOBAL hLoadedResource = LoadResource(hInstance, hResource);
if (hLoadedResource == NULL) {
std::cerr << "Failed to load XML resource: " << xmlFileName << std::endl;
return nullptr;
}
DWORD resourceSize = SizeofResource(hInstance, hResource);
void* resourceData = LockResource(hLoadedResource);
return (char*)resourceData;
}
测试代码
typedef char* (*ReadXML)(void);
int main()
{
HMODULE handle = LoadLibrary(L"xmlindlldemo.dll");
if (handle == nullptr)
return -1;
ReadXML readXML = (ReadXML)GetProcAddress(handle, "ReadXML");
char* ret = readXML();
std::cout << ret << std::endl;
return 0;
}
结果