从c#嵌入资源到本机exe

时间:2014-06-02 01:10:13

标签: c# c++ embedded-resource

我想使用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);

Actualy,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(句柄,&#34; RT_RCDATA&#34;,&#34; 104&#34;,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);

再次感谢您的时间!

1 个答案:

答案 0 :(得分:1)

您似乎传递了错误的值,并且由于它们未显示,我认为您的功能(ToPtrBeginUpdateResourceUpdateResourceEndUpdateResource)可能也被错误地定义。

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

从一开始就开始吧。您对UpdateResource的声明是什么样的?我很快发现了两个相互矛盾的例子:

第一个使得很难处理整数ID;第二个使得很难处理字符串。我想我会期望IntPtr用于Type和Name参数。

一旦你解决了这个问题,下一步是了解MAKEINTRESOURCE宏在C#中的等价物。这需要了解MAKEINTRESOURCE smuggles integers in pointers的方式。一旦你理解了这一点,很容易告诉你需要传递什么来将整数104或10传递给UpdateResource