从c#嵌入资源到本机exe

embed resource to native exe from c#

本文关键字:本机 exe 嵌入资源      更新时间:2023-10-16

我想用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, UpdateResourceEndUpdateResource)也可能定义不正确。

注意MAKEINTRESOURCE(104)将整型值104转换为字符串指针;它不会创建值为"104"的字符串。类似地,RT_RCDATA可能是"RT_RCDATA"以外的值的宏,例如MAKEINTRESOURCE(10)

所以从头开始。你的UpdateResource报关单是什么样的?我很快发现了两个相互矛盾的例子:

  • pinvoke.net
  • 如何添加一个图标到现有的exe文件(默认没有图标)?(在问题中)

第一个使得很难处理整数id;第二个问题使处理字符串变得困难。我想我希望使用IntPtr类型和名称参数。

一旦你解决了这个问题,下一个就是理解MAKEINTRESOURCE宏在c#中的等价。这需要理解MAKEINTRESOURCE是如何在指针中走私整数的。一旦你理解了这一点,就很容易知道你需要在这里传递什么来将整数104或10传递给UpdateResource