Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы с UpdateResource, Все продолжаються... 
:(
    Опции темы
Sunvas
Дата 13.8.2007, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: нет
Всего: 89



В делфи все было так:
Код

UpdateResource(Hnd, RT_RCDATA, PChar(ResName), 1049, Buf, Size);


Но что писать в Шарпе вместо RT_RCDATA и PChar(ResName) ?


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
tol05
Дата 13.8.2007, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



попробуй
Код

[DllImport("KERNEL32.DLL", EntryPoint="UpdateResourceW", SetLastError=true,
  CharSet=CharSet.Unicode, ExactSpelling=true, CallingConvention=CallingConvention.StdCall)]
public static extern bool UpdateResource(IntPtr hUpdate, UInt32 pType, UInt32 pName,
                                         UInt16 wLanguage, byte[] pData, UInt32 cbData);

или
Код

[DllImport("KERNEL32.DLL", EntryPoint="UpdateResourceW", SetLastError=true,
  CharSet=CharSet.Unicode, ExactSpelling=true, CallingConvention=CallingConvention.StdCall)]
public static extern bool UpdateResource(IntPtr hUpdate, string pType, UInt32 pName,
                                         UInt16 wLanguage, byte[] pData, UInt32 cbData);



--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Sunvas
Дата 13.8.2007, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: нет
Всего: 89



tol05, твой код у меня уже есть. Вопрос немного в другом.


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
tol05
Дата 13.8.2007, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



да, затупил немного... :(

вместо RT_RCDATA пиши "RT_RCDATA "
вместо PChar(ResName) пиши "MyResource" (имя ресурса)

маршаллинг этих параметров - через string, благо MSDN разрешило
сигнатура метода взята с www.pinvoke.net 
Код

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



--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
tol05
Дата 14.8.2007, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



пример записи/считывание Win32 ресурсов в/из управляемую dll

сборка, куда пишем ресурсы, называется Resource.dll
приложение, пишущее ресурсы в Resource.dll называется ResourceWriter.exe
приложение, читающее ресурсы в Resource.dll называется ResourceWriter.exe
сами ресурсы - текстовый файл Test.txt

Чтобы не морочиться с путями к файлам и сборкам я в примере все билдаю в общую папку, там же лежит Test.txt
Код комментировать не буду - он читабельный и интуитивно понятен.

код Resources.dll
Код

namespace Resources
{
  public class Resource
  {
  }
}


код ResourceWriter.exe
Код

namespace Resources
{
  class ResourceWriter
  {
    [DllImport("KERNEL32.DLL", EntryPoint = "BeginUpdateResourceW", SetLastError = true,
        CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
    public static extern IntPtr BeginUpdateResource(string pFileName, bool bDeleteExistingResources);


    [DllImport("KERNEL32.DLL", EntryPoint = "UpdateResourceW", SetLastError = true,
       CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
    public static extern bool UpdateResource(IntPtr hUpdate, string pType, UInt32 pName, UInt16 wLanguage, byte[] pData, UInt32 cbData);

    [DllImport("KERNEL32.DLL", EntryPoint = "EndUpdateResourceW", SetLastError = true,
       CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
    public static extern bool EndUpdateResource(IntPtr hUpdate, bool bDiscard);

    static void Main()
    {
       IntPtr hResource = BeginUpdateResource(@"Resource.dll", false);
       
       //Имя типа ресурса (любая строка, главное, при чтении такую же написать :))
       string resType = "RT_RCDATA";                     
       //Имя ресурса. Можно строками, можно int-ами. Подробности - MSDN, "UpdateResource Function" описание параметров
       UInt32 resName = 1;                                     

       FileStream someFileStream = new FileStream(@"Test.txt", FileMode.Open);

       BinaryReader fileReader = new BinaryReader(someFileStream);

       byte[] someByteArray = fileReader.ReadBytes((int)someFileStream.Length);

       bool result = UpdateResource(hResource, resType, resName, 1049, someByteArray, (uint)someByteArray.Length);

       EndUpdateResource(hResource, false);

       fileReader.Close();
       someFileStream.Close();
    }
  }
}


код ResourceReader.exe
Код

namespace Resources
{
    class ResourceReader
    {
        [DllImport("kernel32.dll", SetLastError = true)]
        static extern IntPtr LoadResource(IntPtr hModule, IntPtr hResInfo);

        [DllImport("kernel32.dll", SetLastError = true)]
        static extern IntPtr FindResource(IntPtr hModule, UInt32 lpName, string lpType);

        [DllImport("kernel32.dll")]
        static extern IntPtr LockResource(IntPtr hResData);

        [DllImport("kernel32.dll")]
        static extern IntPtr LoadLibrary(string pFileName);

        [DllImport("kernel32.dll")]
        static extern int SizeofResource(IntPtr hModule, IntPtr hResInfo);

        static void Main(string[] args)
        {
           IntPtr hModule = LoadLibrary("Resource.dll");              
        
           string lpType = "RT_RCDATA";

           UInt32 lpName = 1;

           IntPtr resH1 = FindResource(hModule, lpName, lpType);

           if (IntPtr.Zero == resH1)  throw new System.ComponentModel.Win32Exception();

           IntPtr resH2 = LoadResource(hModule, resH1);

           if (IntPtr.Zero == resH2) throw new System.ComponentModel.Win32Exception();

           IntPtr resH3 = LockResource(resH2);            

           if (IntPtr.Zero == resH3) throw new Exception("Lock failed");

           int resSize = SizeofResource(hModule, resH1);            

           byte[] y = new byte[resSize];

           Marshal.Copy(resH3, y, 0, (int)resSize);                      
           //Вот строка ресурсов
           string content = Encoding.Default.GetString(y);          
        }
    }
}



--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0445 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.