从c#嵌入资源到本机exe
embed resource to native exe from c#
我想用c#在exe文件中嵌入一个资源。
如果我使用c++代码,它工作得很好:
UpdateResource(hResource,RT_RCDATA,MAKEINTRESOURCE(104),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),(LPVOID)text,FileSize);
我使用的c#代码:
IntPtr handle = BeginUpdateResource(this.NomeFileCryptato, false);
IntPtr fileptr = ToPtr(encrypted);
bool res = UpdateResource(handle, "RT_RCDATA", "104", 1040, fileptr, Convert.ToUInt32(encrypted.Length));
EndUpdateResource(handle, false);
实际上,c#代码将资源嵌入到exe文件中(让我们称之为a.exe),但如果我将资源嵌入到c++中,a.exe可以读取和提取,如果我从c#中嵌入,a.exe不能。
任何想法?
这是c#中更新资源的声明:
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool UpdateResource(IntPtr hUpdate, string lpType, string lpName, ushort wLanguage, IntPtr lpData, uint cbData);
lpType和lpName都是字符串,如果我使用UpdateResource(handle, "RT_RCDATA", "104", 1040, fileptr, Convert.ToUInt32(encrypted.Length));UpdateResource将资源正确地添加到exe.
问题出在c++上。要访问从c#中添加的资源,我必须使用LPCSTR而不使用makeintresource宏。
LPCSTR nome = "CDATA";
LPCSTR tipo = "104";
hLibrary = LoadLibrary(this->filename);
hResource = FindResource(hLibrary, tipo, nome);
再次感谢您的时间!
您似乎传递了不正确的值,由于它们没有显示,我认为您的函数(ToPtr
, BeginUpdateResource
, UpdateResource
和EndUpdateResource
)也可能定义不正确。
注意MAKEINTRESOURCE(104)
将整型值104转换为字符串指针;它不会创建值为"104"
的字符串。类似地,RT_RCDATA
可能是"RT_RCDATA"
以外的值的宏,例如MAKEINTRESOURCE(10)
。
所以从头开始。你的UpdateResource
报关单是什么样的?我很快发现了两个相互矛盾的例子:
- pinvoke.net
- 如何添加一个图标到现有的exe文件(默认没有图标)?(在问题中)
第一个使得很难处理整数id;第二个问题使处理字符串变得困难。我想我希望使用IntPtr
类型和名称参数。
一旦你解决了这个问题,下一个就是理解MAKEINTRESOURCE
宏在c#中的等价。这需要理解MAKEINTRESOURCE
是如何在指针中走私整数的。一旦你理解了这一点,就很容易知道你需要在这里传递什么来将整数104或10传递给UpdateResource
。
- 从C++本机插件更新Vector3数组
- GCC本机矩阵运算库
- VC++本机单元测试,找不到调试符号
- 在这种情况下,java对象是否可以调用本机函数
- PC中的程序和PHONE中的本机描述应用程序之间的数据连接
- 为什么导入Mixed native/CLR lib.dll的本机C++应用程序没有在Mixed lib.dll中的外部变
- 无法将标准库导入本机 android 项目中的头文件
- 使用本机 C++ 应用程序中的 C# 代码
- 在nodejs中使用本机代码的最佳方法是什么?
- 如何告诉本机节点模块所需的dll存储在哪里?
- 在自定义程序中使用本机 Windows 自然顺序排序
- 如何在C++非托管/本机 DLL 中从注册免费 COM C# 托管 DLL 创建 COM 对象
- MS 本机单元测试 - 断言::线程失败不起作用
- 将音频从浏览器流式传输到WebRTC本机C++应用程序
- Winapi - SetWindowLongPtr in ShutdownBlockReason创建/销毁JNI本机代码
- C++/CLI 混合托管/本机 DLL 不起作用
- 子系统中的异常处理:本机
- 如何在 windowsservercore Docker 映像上安装执行本机C++ DLL/EXE 所需的所有依赖二进制
- 从c#嵌入资源到本机exe
- 为什么生成pdb文件会增加本机c++ exe文件的大小?