Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вызов из DLL функции основной программы 
V
    Опции темы
EnergoHokum
Дата 28.5.2007, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 3
Всего: 6



Подскажите, как вызвать из дл-ки функцию, определённую в программе, которая эту дл-ку подгружает?

Добавлено через 7 минут и 27 секунд
Немного уточню: есть ли возможность определить свою функцию в глобальном пространстве имён, чтобы из дл-ок к ней можно было обращаться вроде ::MyNewFunction() ?
PM MAIL ICQ   Вверх
Tectoder
Дата 28.5.2007, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

Репутация: 7
Всего: 8



Только если у exe эта функция экспортируется, а dll получает указатель на нее через GetProcAddress
Либо если exe както передает в dll указатель на функцию
PM   Вверх
EnergoHokum
Дата 28.5.2007, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 3
Всего: 6



А как передать указатель из exe-шника в дл-ку? Он должен быть указателем на что? В exe-шнике это this, а к чему его приводить в дл-ке?
PM MAIL ICQ   Вверх
korbian
Дата 28.5.2007, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 9
Всего: 14



Тип функции 
Код

int func(int val);

 можно представить как
Код

typedef int  (*Tfunc)(int val);

таким образом можно передать в dll Tfunc*.
ИМХО должно сработать или я что то не так понял(не судите строго).


--------------------
korbian ©
PM   Вверх
EnergoHokum
Дата 28.5.2007, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 3
Всего: 6



От ить! Про указатели на функции я и забыл! Вот что значит УТРО ПЕЛЬНИКА - самое страшное утро!
PM MAIL ICQ   Вверх
Pulse69
Дата 28.5.2007, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: 8
Всего: 10



Если Вы пишете на C++, а нужных функций в исполняемом модуле много, 
возможно, лучше воспользоваться таким методом:

Создать интерфейсный класс с чисто виртуальными методами. 
Его описание поместить в EXE и в DLL.
Код

class IEXEmodule
{
public:
    virtual void doStuff( ) = 0;
    virtual void doOtherStuff() = 0;
};



В исполняемом модуле создать наследника от этого класса
и перегрузить все методы.
Код

class EXEmodule : public IEXEmodule
{
    virtual void doStuff( ) 
    {
        //  Реализация
    }

    virtual void doOtherStuff()
    {
        //  Реализация
    }
};


Теперь если в EXE  сделать
IEXEmodule *pModule=  new EXEmodule();
и передать pModule в DLL, с помощью этого указателя можно использовать все функции, предоставляемые исполняемым модулем.


--------------------
Ctrl+Alt+Reset 
PM MAIL   Вверх
EnergoHokum
Дата 30.5.2007, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 3
Всего: 6



Не, в exe-шнике у меня одна функция, к которой нужно достучаться из дл-ок. А добрался я до неё по аналогии: в exe-шнике объявил её как
Код

//a.exe
extern "C" __declspec(dllexport) RetValue Function(Param param)
{;}

А в дл-ке импортирую её с помощью
Код

//dll3.dll
char moduleName[0xFF];//Путь к вызывающему exe-шнику
HMODULE hCalledProcess;//Handle вызывающего exe-шника
typedef RetValue(*pFunction)(Param param);
pFunction pf;
extern "C" BOOL WINAPI DllMain(HANDLE hInstDll,DWORD dwReason,LPVOID lpvReserved)
{
    GetModuleFileName(NULL,moduleName,sizeof(moduleName)/sizeof(char));
    hCalledProcess=::GetModuleHandle(moduleName);
    pf=(pFunction)::GetProcAddress(hCalledProcess,"Function")
}
pf(NewParam newParam);

В общем считаю, проблему успешно заборол. Спасибо за участие!
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




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


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

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