Большой СОМ сервер
От: Ruslan2  
Дата: 22.06.03 14:00
Оценка:
HI ALL! Надеюсь мой вопрос не покажется очень сложным, но в доступной литературе ответ на него не нашёл. Имеется большой файл с неструктурированными данными (более 5 Мб). Необходимо на его основе создать несложный СОМ сервер, который использует все эти данные. Вопрос: как поместить данные в файл сервера (*.dll) в VС++6, как в дальнейшем получить доступ к данным из методов сервера (данные представляют собой смесь из различных типов).
Спасибо!
Re: Большой СОМ сервер
От: Слава Израиль  
Дата: 22.06.03 18:27
Оценка: 7 (1)
Здравствуйте, Ruslan2, Вы писали:

R> HI ALL! Надеюсь мой вопрос не покажется очень сложным, но в доступной литературе ответ на него не нашёл. Имеется большой файл с неструктурированными данными (более 5 Мб). Необходимо на его основе создать несложный СОМ сервер, который использует все эти данные. Вопрос: как поместить данные в файл сервера (*.dll) в VС++6, как в дальнейшем получить доступ к данным из методов сервера (данные представляют собой смесь из различных типов).

R> Спасибо!

В принципе любой файл мщжно оформить в виде ресурса ( как, например, диалог или курсор <ну ты понал о чём это я> ). И тогда он попадает в твою dll (exe). Если это то, что тебе надо, то копай MSDN (RSDN) на предмет Resources
Спасибо за внимание
Re[2]: Большой СОМ сервер
От: George Seryakov Россия  
Дата: 22.06.03 18:55
Оценка: 2 (1)
Здравствуйте, Слава, Вы писали:

R>> HI ALL! Надеюсь мой вопрос не покажется очень сложным, но в доступной литературе ответ на него не нашёл. Имеется большой файл с неструктурированными данными (более 5 Мб). Необходимо на его основе создать несложный СОМ сервер, который использует все эти данные. Вопрос: как поместить данные в файл сервера (*.dll) в VС++6, как в дальнейшем получить доступ к данным из методов сервера (данные представляют собой смесь из различных типов).


С>В принципе любой файл мщжно оформить в виде ресурса ( как, например, диалог или курсор <ну ты понал о чём это я> ). И тогда он попадает в твою dll (exe). Если это то, что тебе надо, то копай MSDN (RSDN) на предмет Resources


Да, я б тоже пробовал так. Я бы пробовал прилинковать файл командой (в RC файле)
1 TYPELIB "BIGFILE.BIN"


после чего его нужно:
1) найти. Функция FindResource, необходимо нонять какой у него будет тип и имя, это можно посмотреть каким-нибудь просмотрщиком ресурсов. TYPELIB не документирована в должной мере,
2) загрузить. Функция LoadResource.
3) получить указатель на образ загруженного файла в памяти. Функция LockResource.
GS
Re[3]: Большой СОМ сервер
От: Слава Израиль  
Дата: 22.06.03 19:21
Оценка:
Здравствуйте, George Seryakov
И тебе спасибо
Спасибо за внимание
Re[3]: Большой СОМ сервер
От: Ruslan2  
Дата: 25.06.03 17:17
Оценка:
Здравствуйте, George Seryakov, Вы писали:

GS>Здравствуйте, Слава, Вы писали:



GS>после чего его нужно:

GS>1) найти. Функция FindResource, необходимо нонять какой у него будет тип и имя, это можно посмотреть каким-нибудь просмотрщиком ресурсов. TYPELIB не документирована в должной мере,
GS>2) загрузить. Функция LoadResource.
GS>3) получить указатель на образ загруженного файла в памяти. Функция LockResource.

Свои данные в файл сервера я запихнул, это действительно не сложно. Но у меня под рукой нет ни одного просмотрщика ресурсов. Дайти пожайлуста ссылку на любой free просмотрик.
Re[4]: Большой СОМ сервер
От: George Seryakov Россия  
Дата: 25.06.03 17:28
Оценка:
Здравствуйте, Ruslan2, Вы писали:

R> Свои данные в файл сервера я запихнул, это действительно не сложно. Но у меня под рукой нет ни одного просмотрщика ресурсов. Дайти пожайлуста ссылку на любой free просмотрик.


http://www.inner-smile.com/dl_res.htm
GS
Re[4]: Большой СОМ сервер
От: Слава Израиль  
Дата: 26.06.03 21:14
Оценка:
Здравствуйте, Ruslan2, Вы писали:

R>Здравствуйте, George Seryakov, Вы писали:



R> Свои данные в файл сервера я запихнул, это действительно не сложно. Но у меня под рукой нет ни одного просмотрщика ресурсов. Дайти пожайлуста ссылку на любой free просмотрик.


здесь
Спасибо за внимание
Re[5]: Большой СОМ сервер
От: George Seryakov Россия  
Дата: 26.06.03 21:32
Оценка:
Здравствуйте, Слава, Вы писали:

R>> Свои данные в файл сервера я запихнул, это действительно не сложно. Но у меня под рукой нет ни одного просмотрщика ресурсов. Дайти пожайлуста ссылку на любой free просмотрик.


С>здесь


Я, пожалуй, был не прав. Простым просмотрщиком ресурсов не увидеть какое имя будет у ресурса TYPELIB. Это нао лопатить формат EXE-файла, секция ресурсов.
GS
Re[6]: Большой СОМ сервер
От: Слава Израиль  
Дата: 27.06.03 08:08
Оценка:
Здравствуйте, George Seryakov, Вы писали:

GS>Здравствуйте, Слава, Вы писали:


R>>> Свои данные в файл сервера я запихнул, это действительно не сложно. Но у меня под рукой нет ни одного просмотрщика ресурсов. Дайти пожайлуста ссылку на любой free просмотрик.


С>>здесь


GS>Я, пожалуй, был не прав. Простым просмотрщиком ресурсов не увидеть какое имя будет у ресурса TYPELIB. Это нао лопатить формат EXE-файла, секция ресурсов.


Имя ресурса существует только в твоём коде. Это выглядеть может так:
в файле recources.h , например:
#define IDC_MYRECOURSE 555


в данном случае твой ресурс идентифицируется номером 555, который покажет просмоторщик русурсов, а IDC_MYRECOURSE — это эквивалент номера, существующий до компиляции.

А есле не секрет- зачем билиотеку типов засовывать в ресурсы?
Спасибо за внимание
Re[7]: Большой СОМ сервер
От: George Seryakov Россия  
Дата: 27.06.03 15:08
Оценка: 1 (1)
Здравствуйте, Слава, Вы писали:

GS>>Я, пожалуй, был не прав. Простым просмотрщиком ресурсов не увидеть какое имя будет у ресурса TYPELIB. Это надо лопатить формат EXE-файла, секция ресурсов.


С>Имя ресурса существует только в твоём коде.


Ты уверен? А ты имя ресурса никогда не видел при просмотре исполняемого файла? Оно там как-то сужествует, чтоб ты его увидел?

С>А есле не секрет- зачем билиотеку типов засовывать в ресурсы?


А человек хотел обертку вокруг файла данных, вшитых в исполняемый файл. Вроде, засунуть в исполняемый файл можно через ресурс типа TYPELIB.
GS
Re[6]: Большой СОМ сервер
От: George Seryakov Россия  
Дата: 27.06.03 15:48
Оценка: 3 (2)
Здравствуйте, George Seryakov, Вы писали:

GS>Я, пожалуй, был не прав. Простым просмотрщиком ресурсов не увидеть какое имя будет у ресурса TYPELIB. Это нао лопатить формат EXE-файла, секция ресурсов.


Отставить лопатить бинарики. Это делается так:

В rc-файле:
1 TYPELIB "res_inc.tlb"
2 TYPELIB "bigfile.bin"

//  или

1 BIGFILE "bigfile.bin"


В коде:


HINSTANCE h = _Module.GetModuleInstance();

HRSRC hrs = FindResource(h, MAKEINTRESOURCE(2), "TYPELIB");

// или

hrs = FindResource(h, MAKEINTRESOURCE(1), "BIGFILE");

HGLOBAL hrglob = LoadResource(h, hrs);

char *p = (char*)LockResource(hrglob);


То есть мы можем написать люое имя ресурса, а номер ресурса указывается через макрос MAKEINTRESOURCE.
GS
Re[8]: Большой СОМ сервер
От: Слава Израиль  
Дата: 27.06.03 20:02
Оценка:
Здравствуйте, George Seryakov, Вы писали:

С>>Имя ресурса существует только в твоём коде.


GS> Ты уверен? А ты имя ресурса никогда не видел при просмотре исполняемого файла? Оно там как-то сужествует, чтоб ты его увидел?


Открываю в VS мой скомпилированный exe-шник, в поле "Open As" указываю Resources и вместо имён вижу номера. Может быть я не так понимаю что такое имя ресурса?.

GS> А человек хотел обертку вокруг файла данных, вшитых в исполняемый файл. Вроде, засунуть в исполняемый файл можно через ресурс типа TYPELIB.

OK.
Спасибо за внимание
Re[9]: Большой СОМ сервер
От: George Seryakov Россия  
Дата: 27.06.03 20:20
Оценка:
Здравствуйте, Слава, Вы писали:

С>Открываю в VS мой скомпилированный exe-шник, в поле "Open As" указываю Resources и вместо имён вижу номера. Может быть я не так понимаю что такое имя ресурса?.


А, так это нумерованные ресурсы. Ты можешь работать с ресурсом через имя (тогда в таблице ресцрсов будет стоять оно), а можешь — через номер. Тогда во всех вызовах вместо указателя на строку-имя ресурса будет стоять MAKEINTRESOURCE(N), т.е. просто число откакстенное на LPSTR.

А вместо числа там может стоять строка, она же и пойдет в таблицу ресурсов. Правда, по дефолту VS уже строковых имен не делает. Но ты вполне можешь ручками добавить что-то вроде

MYABOUT DIALOG DISCARDABLE  0, 0, 235, 55
...


и оно будет видно в ресурсах со строковым именем "MYABOUT".
GS
Re[7]: Большой СОМ сервер
От: Ruslan2  
Дата: 28.06.03 07:23
Оценка:
Здравствуйте, George Seryakov, Вы писали:

Сделал как ты показал и всё заработало. Кстати в MSDN я этого варианта функции FindResource не нашёл.
Немного помучившись я нашёл стандартный вариант использования большого ресурса только с помощью среды, без взяких изменений ресурсного файла: Когда через ResourceView добавляешь свой тип ресурса, то сам задаёш имя типа ресурса. Я задал имя BIN. В эту категорию студия и поместила мой файл данных. А теперь:

    HINSTANCE h = _Module.GetModuleInstance();
    HRSRC  hRes = FindResource (h, MAKEINTRESOURCE (201), "BIN");
    HGLOBAL hrglob = LoadResource(h, hRes);
    char *p = (char*) LockResource(hrglob);

Номер ресурса берётся в Resource.h. Интересно, что когда я помещал вместо MAKEINTRESOURCE (201) — IDR_BIN1, имя ресурса заданное студией, то ничего не работало.
Как теперь правильно освободить HGLOBAL и указатель, в MSDN указаны только стандартные функции?
Re[8]: Большой СОМ сервер
От: George Seryakov Россия  
Дата: 28.06.03 12:08
Оценка:
Здравствуйте, Ruslan2, Вы писали:

R>
R>    HINSTANCE h = _Module.GetModuleInstance();
R>    HRSRC  hRes = FindResource (h, MAKEINTRESOURCE (201), "BIN");
R>    HGLOBAL hrglob = LoadResource(h, hRes);
R>    char *p = (char*) LockResource(hrglob);
R>


R>Номер ресурса берётся в Resource.h. Интересно, что когда я помещал вместо MAKEINTRESOURCE (201) — IDR_BIN1, имя ресурса заданное студией, то ничего не работало.


Ты помещал IDR_BIN1 или MAKEINTRESOURCE (IDR_BIN1)?

R> Как теперь правильно освободить HGLOBAL и указатель, в MSDN указаны только стандартные функции?


Никак. Они выгрузятся при вгрузке модуля.
GS
Re[9]: Большой СОМ сервер
От: Ruslan2  
Дата: 30.06.03 15:03
Оценка:
Здравствуйте, George Seryakov, Вы писали:

И так и так, и ещё с кавычками оба варианта, хотя понимал, что делаю глупость. И #include "resource.h" в хедерном файле есть, т.е должно работать вместо 201 — IDR_BIN1, но не работает, наверное студия где-то недорабатывает, а может и я лопухнулся, хотя несколько раз перепроверял. Но я и ранее сталкивался с подобным поведением, менял имя на код и работал дальше, просто внимания этому не придавал.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.