从c#嵌入资源到本机exe
本文关键字:本机 exe 嵌入资源 | 更新日期: 2023-09-27 18:06:06
我想用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
。