GetProcAddress и имена с собаками
От: DZ_JIGVAL  
Дата: 18.11.02 02:59
Оценка:
Пишу dll
в ней есть функция

__declspec(dllexport) int __stdcall Init(pSend Send);

Когда подцепляю (динамически) ее, то хотелось бы писать следущее:
tmpInit = (pInit) GetProcAddress(h_plugin, "Init");

а не
tmpInit = (pInit) GetProcAddress(h_plugin, "?Init@@YGHP6GHHPADH@Z@Z");

.def файл сгенерил, НО как его использовать то?
у мухи слуховой аппарат расположен на крыльях.... и это можно доказать!
Re: GetProcAddress и имена с собаками
От: retalik www.airbandits.com/
Дата: 18.11.02 03:53
Оценка:
Здравствуйте, DZ_JIGVAL, Вы писали:

DJ>__declspec(dllexport) int __stdcall Init(pSend Send);

...
DJ>а не
DJ>tmpInit = (pInit) GetProcAddress(h_plugin, "?Init@@YGHP6GHHPADH@Z@Z");

В принципе, ты можешь описать функцию как
extern "C" __declspec(dllexport) int __stdcall Init(pSend Send);

, тогда придеься грузить ее по имени "_Init" — это может быть проще.

DJ>.def файл сгенерил, НО как его использовать то?

Тоже вариант. Если компилируешь в среде Visual C++, просто подключи его к проекту. Иначе передавай его в опции линкера /def:myfile.def.
Успехов,
Виталий.
Re[2]: GetProcAddress и имена с собаками
От: Аноним  
Дата: 18.11.02 04:57
Оценка:
Здравствуйте, retalik, Вы писали:

R>В принципе, ты можешь описать функцию как

R>
R>extern "C" __declspec(dllexport) int __stdcall Init(pSend Send);
R>

R>, тогда придеься грузить ее по имени "_Init" — это может быть проще.

пока устраивает, уже посмотрел. (_Init@4)Т.е. если я правильно понял, в независимости от компилира extern "C" заставит сделать именно такие имена? (например если кто в Делфи делает, есди это возможно, или в Билдере)

DJ>>.def файл сгенерил, НО как его использовать то?

R>Тоже вариант. Если компилируешь в среде Visual C++, просто подключи его к проекту. Иначе передавай его в опции линкера /def:myfile.def.

дык, в том то и дело, что динамически надо, что-то типа плаг-инов.
c COM и CORBA и все такое не очень охота разбираться, да и навороты не нужны.
Re[3]: GetProcAddress и имена с собаками
От: retalik www.airbandits.com/
Дата: 18.11.02 05:10
Оценка:
Здравствуйте, Аноним, Вы писали:

А>пока устраивает, уже посмотрел. (_Init@4)

А, да, у тебя же __stdcall... Тогда действительно _Init@4. _Init — это для __cdecl.

А>Т.е. если я правильно понял, в независимости от компилира extern "C" заставит сделать именно такие имена? (например если кто в Делфи делает, есди это возможно, или в Билдере)

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

DJ>>>.def файл сгенерил, НО как его использовать то?

R>>Тоже вариант. Если компилируешь в среде Visual C++, просто подключи его к проекту. Иначе передавай его в опции линкера /def:myfile.def.
А>дык, в том то и дело, что динамически надо, что-то типа плаг-инов.
Что значит динамически? Ты же все равно свою DLL скомпилировать должен. Вот при ее компиляции и задай имя def-файла. Тогда получится экспортировать просто "Init".
Успехов,
Виталий.
Re[3]: GetProcAddress и имена с собаками
От: Игорь Вартанов Ниоткуда  
Дата: 18.11.02 05:55
Оценка:
Здравствуйте, Аноним, Вы писали:

А>пока устраивает, уже посмотрел. (_Init@4)Т.е. если я правильно понял, в независимости от компилира extern "C" заставит сделать именно такие имена? (например если кто в Делфи делает, есди это возможно, или в Билдере)


Категорически НЕТ.
Указанное имя специфично исключительно для Microsoft C/C++. У борланда extern "C" __stdcall был вообще без какого-либо манглинга (для его линейки C/C++, скорее всего и для билдера то же самое).

С Delphi вообще отдельная песня. Сей продукт никакого отношения к C/C++ компиляторам не имеет, и все их законы на него не распространяются. Короче, делфа экспортирует имя один в один.

DJ>>>.def файл сгенерил, НО как его использовать то?

R>>Тоже вариант. Если компилируешь в среде Visual C++, просто подключи его к проекту. Иначе передавай его в опции линкера /def:myfile.def.

А>дык, в том то и дело, что динамически надо, что-то типа плаг-инов.


Уважаемый, вы о чем? Виталик говорит о компиляции, а вы?

А>c COM и CORBA и все такое не очень охота разбираться, да и навороты не нужны.


Мама дорогая! Plugin's topic revisited!!!

Все что нужно, так это одна единственная экспортируемая функция, в которую передается структура, первым полем которой будет признак версии (у MS эту роль выполняет поле размера передаваемой структуры). В эту структуру плагин запишет адреса всех входов своего API и глобальных данных (последнее — при необходимости). Эта структура будет для базового экзешника эквивалентом секции импорта плагина.

Другой вариант — эта структура формируется самим плагином, и указатель на нее возвращается его функцией инициализации.

P.S. Я хоть в тему ответил?
---
С уважением,
Игорь
Re[4]: GetProcAddress и имена с собаками
От: DZ_JIGVAL  
Дата: 18.11.02 06:36
Оценка:
Здравствуйте, retalik, Вы писали:

DJ>>>>.def файл сгенерил, НО как его использовать то?

R>>>Тоже вариант. Если компилируешь в среде Visual C++, просто подключи его к проекту.

Все! Понял!
Ступил на счет компиляции с ключем /def:myfile.def.
у мухи слуховой аппарат расположен на крыльях.... и это можно доказать!
Re[4]: GetProcAddress и имена с собаками
От: DZ_JIGVAL  
Дата: 18.11.02 06:50
Оценка:
Здравствуйте, Игорь Вартанов, Вы писали:

А>>пока устраивает, уже посмотрел. (_Init@4)Т.е. если я правильно понял, в независимости от компилира extern "C" заставит сделать именно такие имена? (например если кто в Делфи делает, есди это возможно, или в Билдере)


ИВ>Категорически НЕТ.


ясно.

ИВ>Мама дорогая! Plugin's topic revisited!!!


ИВ>Все что нужно, так это одна единственная экспортируемая функция, в которую передается структура, первым полем которой будет признак версии (у MS эту роль выполняет поле размера передаваемой структуры). В эту структуру плагин запишет адреса всех входов своего API и глобальных данных (последнее — при необходимости). Эта структура будет для базового экзешника эквивалентом секции импорта плагина.


про единственную фунцию и все такое — прочитал, на RSDN-e же. Собственно как "ту единственную" то загрузить.
Я уже написал, что просто неправильно понял куда при.... примазать полученный mydll.def
Теперь то все ясно

ИВ>P.S. Я хоть в тему ответил?


О да! Именно после этого сообщения я то и понял — КАК БЫЛ НЕПРАВ!
всем пасиб
у мухи слуховой аппарат расположен на крыльях.... и это можно доказать!
Re[4]: GetProcAddress и имена с собаками
От: Andrew S Россия http://alchemy-lab.com
Дата: 18.11.02 06:56
Оценка:
R>Насколько я не знаю , в дельфях можно экспортируемой функции любое имя задать. Спроси в соответствующем форуме.

В дельфях да — в билдере же (как здесь уже замечали) extern "C" etc будет генерить имя вообще без декораций.
Вот что надо для Дельфи:

exports
    SomeFunctionName name 'exportname',
    SomeFunctionName1 name 'exportname1',
....
begin
// dll begin
http://www.rusyaz.ru/pr — стараемся писАть по-русски
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.