标签:
?
exe/dll有对应的入口函数main/_tmain/winmain/_dllmain等;透过这些入口函数可以获取exe文件路径或者文件的handle[exe通过入口函数拿到路径后调用LoadLibrary得到句柄,dll直接从入口函数得到句柄];静态库没有入口函数拿不到句柄不能进行资源嵌入;
?
调用代码示例:
[纯数据文件,如果是media文件{音视频文件}或者数据库db文件等需要用专门库解析的文件则可以考虑将读取的数据指针的内容写入本地临时文件后再调用相关的库去读取文件内容]
?
HMODULE hExe = LoadLibrary((argv[0])); if (hExe == NULL) { return -1; } ? HRSRC hrc= FindResource(hExe,MAKEINTRESOURCE(IDR_MLDATA1),L"MLDATA"); int x = SizeofResource(hExe,hrc); printf("%d\n", x); ? HGLOBAL hResLoad = LoadResource(hExe, hrc); float* ptr = (float*)LockResource(hResLoad); if (ptr == NULL) { return -1; } ? // here use ptr as raw data pointer and finish your work // ... ? if (!FreeLibrary(hExe)) { return -1; } |
?
在注释处使用指针ptr完成工作即可,对应没有使用资源嵌入的代码应是如此:
char* file = "data.bin" float* ptr = new float[36*32768]; FILE* f = fopen(file, "rb"); fread(ptr, sizeof(float), 36*32768, f); fclose(f); // here use ptr as raw data pointer and finish your work // ... |
?
通过资源嵌入方式访问数据时FindResource参数里的IDR_MLDATA1为向visual studio里导入资源时自动生成的ID; 第三个参数" MLDATA"是导入类型时自定义的类型名称;
?
第一步;右键添加资源
?
第二步:通过右侧Import入口导入自定类型资源
?
第三步:右下角文件类型过滤器选all files后,在浏览区域里选定要添加的数据文件
?
?
第四步:输入自定义的数据类型字符串;该字符串在FindResource接口中用到
?
?
?
编写一个汇编文件 blob.S
?
.global blob .global blob_size .section .rodata blob: .incbin "blob.bin" 1: blob_size: .int 1b - blob |
?
在调用的文件里声明
?
extern uint8_t blob[]; extern int blob_size; |
?
直接按名称使用即可
?
编译的指令:
gcc -c blob.S -o blob.o |
?
?
?
Mac下可用gcc,按linux下方式操作
?
?
?
[1] http://blog.csdn.net/bupt073114/article/details/26691183
[2] https://msdn.microsoft.com/en-us/library/ms648008(v=vs.85).aspx#_win32_Updating_Resources
[3] http://stackoverflow.com/questions/1997172/is-there-a-linux-equivalent-of-windows-resource-files
?
?
标签:
原文地址:http://www.cnblogs.com/zstang/p/4324097.html