Обновление изображений в разделе ресурсов исполняемого файла (в C # / C)

У меня есть несколько изображений, встроенных в мой исполняемый файл в разделе ресурсов. Я выполнил следующие шаги, чтобы создать свой исполняемый файл:

  1. Сгенерировал файл .resx для всех изображений (.jpg) в каталоге с помощью некоторой утилиты. Изображения называются image1.jpg, image2.jpg и так далее.
  2. создал файл .resources из файла .resx, используя: resgen myResource.resx
  3. Встроил сгенерированный файл .resource, используя флаг / res как: csc file.cs /res:myResource.resources

4 Я обращаюсь к этим изображениям как:

ResourceManager resources = new ResourceManager("myResource", Assembly.GetExecutingAssembly());

Image foo = (System.Drawing.Image)(resources.GetObject("image1"));

Все работает нормально, как и ожидалось. Теперь я хочу заменить встроенные изображения на несколько новых. Вот что я сейчас делаю:

class foo
{
    [DllImport("kernel32.dll", SetLastError = true)]
        static extern IntPtr BeginUpdateResource(string pFileName, bool bDeleteExistingResources);

    [DllImport("kernel32.dll", SetLastError = true)]
        static extern bool UpdateResource(IntPtr hUpdate, string lpType, string lpName, string wLanguage, Byte[] lpData, uint cbData);

    [DllImport("kernel32.dll", SetLastError = true)]
        static extern bool EndUpdateResource(IntPtr hUpdate, bool fDiscard);


    public static void Main(string[] args)
    {
        IntPtr handle = BeginUpdateResource(args[0], false);

        if (handle.ToInt32() == 0)
            throw new Exception("File Not Found: " + fileName + " last err: " + Marshal.GetLastWin32Error());

        byte[] imgData = File.ReadAllBytes("SetupImage1.jpg");
        int fileSize = imgData.Length;

        Console.WriteLine("Updaing resources");
        if (UpdateResource(handle, "Image", "image1", "image1", imgData, (uint)fileSize))
        {
            EndUpdateResource(handle, false);
            Console.WriteLine("Update successfully");
        }
        else
        {
            Console.WriteLine("Failed to update resource. err: {0}", Marshal.GetLastWin32Error());
        }
    }
}

Приведенный выше код добавляет новый ресурс для указанного изображения (внутри заголовка IMAGE с некоторым случайным числом, как показано в Resource hacker ). , но я хочу изменить существующие данные ресурса для image1 .

Я уверен, что вызываю UpdateResource с некоторыми недопустимыми аргументами.

Может ли кто-нибудь помочь указать на это?

Я использую .NET версии 2

Спасибо,

Викрам

8
задан Adrian Iftode 29 February 2012 в 11:12
поделиться