Я хочу встроить ресурс в исполняемый файл с помощью C #.
Если я использую код 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 (дескриптор, «RT_RCDATA», «104», 1040, fileptr, Convert.ToUInt32 (encrypted.Length));
UpdateResource добавить ресурс правильно в исполняемый файл.
Проблема была на с ++. Чтобы добраться до ресурса, добавленного из 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
выглядит как? Я быстро нашел два противоречивых примера:
Первое затрудняет обработку целочисленных идентификаторов; второе затрудняет работу со строками. Я полагаю, я бы хотел использовать IntPtr
для параметров типа и имени.
После того, как вы разберетесь с этим, следующим моментом будет понимание того, что MAKEINTRESOURCE
Макроэквивалент находится в C #. И это требует понимания того, как MAKEINTRESOURCE
переправляет целые числа в указатели. Как только вы поймете это, легко сказать, что вам нужно передать здесь, чтобы передать целые числа 104 или 10 в UpdateResource
,