我想使用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);
再次感谢您的时间!
答案 0 :(得分:1)
您似乎传递了错误的值,并且由于它们未显示,我认为您的功能(ToPtr
,BeginUpdateResource
,UpdateResource
和EndUpdateResource
)可能也被错误地定义。
注意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
。