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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> PlugThisAPI )) или Окна в ДЛЛ 
:(
    Опции темы
MoZy
  Дата 15.7.2006, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

Репутация: 1
Всего: 0



Суть моего вопроса (подробно):
Допустим у меня реализован так сказать приложение-провайдер. В том смысле, что оно должно осуществлять роль посредника между сервером и плагинами, которые подключаются к этому самому приложению.
Плагины будут представлять собой сетевые игрушки и другие фенечки.
Сами по себе они будут лишь передавать и получать данные от моего "провайдера". С этим проблем нет.

Ну вобщем это все не важно. Важно то что я не могу реализовать обыкновенную WinMain ну и Proc'едуру главную. Вобшем ДЛЛка моя не хочет быть ни чем, кроме библиотеки.

Так как все-таки окошки, процедуры и другие подобные вещи сделать в ДЛЛ?

вобщем я в растерянности... помогите. 
--------------------
Experimentia est optima rerum magistra
PM MAIL WWW ICQ   Вверх
586
Дата 15.7.2006, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Цитата(MoZy @  15.7.2006,  19:45 Найти цитируемый пост)
Так как все-таки окошки, процедуры и другие подобные вещи сделать в ДЛЛ?

Также, как и в exe. 
PM   Вверх
MoZy
Дата 15.7.2006, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

Репутация: 1
Всего: 0



586,  во-первых, я пишу в Dev-C++. Там варианты проектов Win32 DLL, Win32 GUI, ... . Если ставить ГУИ и откомпилить, то все окошки создаются и все нормально. НО создается ЕХЕшник. Но это не самое страшное, а страшно то, что при вызове етого ехешника как библиотеки, он и работает как библиотека и окна не создаются (то есть только функции и работают). А если компилить просто как ДЛЛ - окошек ни там ни тут не видно. Может есть какие-то особые штуки, которые надо сделать, чтобы все было хорошо? 
например, если 
Цитата

Также, как и в exe.
 то куда девать АППЕНТРИ?

даю кусок кода. хедер с экспортными функциями приводить не буду - нет необходимости.

Код

#include <windows.h>
#include "zone.h"


BOOL APIENTRY DllMain (HINSTANCE hInst     /* Library instance handle. */ ,
                       DWORD reason        /* Reason this function is being called. */ ,
                       LPVOID reserved     /* Not used. */ )
{
    switch (reason)
    {
      case DLL_PROCESS_ATTACH:
            hLibInst=hInst;
            
        break;

      case DLL_PROCESS_DETACH:
        break;

      case DLL_THREAD_ATTACH:
        break;

      case DLL_THREAD_DETACH:
        break;
    }

    /* Returns TRUE on success, FALSE on failure */
    return TRUE;
}


/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);


/*  Make the class name into a global variable  */
char szMainWndClass[] = "WindowOne";



HINSTANCE g_Inst,rInst,hPlugin;

HWND hwndMain;

int WINAPI WinMain (HINSTANCE hInst,HINSTANCE hPrevInstance,LPSTR lpszArgument,int nFunsterStil)
{

g_Inst=hInst;

MSG nMsg;
WNDCLASSEX wincl;

/* The Window structure */
wincl.hInstance = hInst;
wincl.lpszClassName = szMainWndClass;
wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
wincl.style = CS_HREDRAW | CS_VREDRAW;  // Catch double-clicks CS_SAVEBITS|
wincl.cbSize = sizeof (WNDCLASSEX);

/* Use default icon and mouse-pointer */
wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
wincl.lpszMenuName = NULL;
wincl.cbClsExtra = 0;
wincl.cbWndExtra = 0;
wincl.hbrBackground = (HBRUSH) BLACK_PEN;

/* Register the window class, and if it fails quit the program */
if (!RegisterClassEx (&wincl)) return 0;

/* The class is registered, let's create the program*/

hwndMain = CreateWindowEx
(
    0,
    szMainWndClass,/* Class name */
    "",
    WS_OVERLAPPEDWINDOW,
    200,
    300,
    300,
    300,
    HostWnd,/* No parent window */
    NULL,/* No menu */
    hInst,/* This program instance */
    NULL/* Creation parameters */
);

ShowWindow (hwndMain, SW_SHOW);


//************MSG*************
while (GetMessage (&nMsg, NULL, 0, 0))
{
    /* Translate virtual-key messages into character messages */
    TranslateMessage(&nMsg);
    /* Send message to WindowProcedure */
    DispatchMessage(&nMsg);
}

/* The program return-value is 0 - The value that PostQuitMessage() gave */
return nMsg.wParam;
}


LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT nMsg, WPARAM wParam, LPARAM lParam)
{
switch (nMsg)
{
case WM_CREATE:

return 0;


case WM_DESTROY:
    PostQuitMessage (0);
break;
        
default:
    return DefWindowProc (hwnd, nMsg, wParam, lParam);
}

return 0;
}
 
--------------------
Experimentia est optima rerum magistra
PM MAIL WWW ICQ   Вверх
586
Дата 15.7.2006, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Не понял. У тебя exe-шник в роли exe-шника и библиотеки сразу?
Или WinMain экспортируется.
Или тут слеплен код exe и dll????? 
PM   Вверх
MoZy
Дата 15.7.2006, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

Репутация: 1
Всего: 0



586,  smile  смотря как компилить. Вобщем я бы хотел ДЛЛку, которая была бы обыкновенной ехе, но со связью с "мамой", которая ее  и подгружает. Связь я эту вижу лишь в экспортируемых функциях. Если не трудно, то подскажите структуру и основные моменты )) 


ой. неужели надо просто WinMain экспортировать и запустить из "мамы"? А процедуры не надо? 

Это сообщение отредактировал(а) MoZy - 15.7.2006, 20:41
--------------------
Experimentia est optima rerum magistra
PM MAIL WWW ICQ   Вверх
Pilligrim
  Дата 15.7.2006, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



 smile 
Глянул я твой кусок кода,  и не пойму как у тебя используется DllMain. К-а-к? 
PM MAIL   Вверх
586
Дата 15.7.2006, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



У тебя exe-шник который ты загружаешь, как dll, функцией LoadLibrary.
WinMain у тебя исполняться не будет, а DllMain воспринимается, как обычная функция, и не исполняется. 
Вообще, у DLL ф-ция DllMain - это точка входа.
У твоего exe точка входа - WinMain. А у исполняемого файла две точки входа быть не может!
Поэтому exe просто загружается. 

Это сообщение отредактировал(а) 586 - 15.7.2006, 20:50
PM   Вверх
MoZy
Дата 15.7.2006, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

Репутация: 1
Всего: 0



586,  ну я компилю как DLL проект и получается DLL. Функции экспортируются нормально... Так что мне сделать? Экспортировать WinMain и отказаться от DLLMain? 
--------------------
Experimentia est optima rerum magistra
PM MAIL WWW ICQ   Вверх
586
Дата 15.7.2006, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Если у тебя exe - откажись от DllMain.
Если у тебя dll - откажись от WinMain.
Цитата
Так что мне сделать? Экспортировать WinMain и отказаться от DLLMain?

Хочешь запускать модуль отдельно - exe. 
PM   Вверх
MoZy
Дата 15.7.2006, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

Репутация: 1
Всего: 0



586,  Я хочу, чтобы была связь между модулем и хостом. От WinMain'а отказаться не могу. Нельзя ли сделат ехе, но с расширением ДЛЛ? Кстати, с импортом функций проблем не будет?

Добавлено @ 21:10 
УРААА!!! Я отказался от DLLMain (я его раньше вообще не использовал, просто подумал, что может понадобиться при инициализации) и просто экспортировал WinMain и вызвал в хосте. И теперь у меня в ДЛЛке окошко есть!  smile  
--------------------
Experimentia est optima rerum magistra
PM MAIL WWW ICQ   Вверх
586
Дата 15.7.2006, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Цитата(MoZy @  15.7.2006,  22:07 Найти цитируемый пост)
Нельзя ли сделат ехе, но с расширением ДЛЛ?

Можно, но какой смысл в WinMain.

Цитата(MoZy @  15.7.2006,  22:07 Найти цитируемый пост)
Кстати, с импортом функций проблем не будет?

Не должно.

С экспортом WinMain могут быть проблемы. Я поэксперементировал, и вот что получил:
Код
#include <windows.h>

extern "C"
{
 __declspec(dllexport) int Function1(char*);
 __declspec(dllexport) void Function2();
 __declspec(dllexport) void main(){_asm jmp dword ptr WinMain}
}

int __stdcall WinMain(HINSTANCE, HINSTANCE, char*, int)
{

    return 0;
}

int Function1(char* str)
{
 return MessageBoxA(0, str, 0, 0);
}

void Function2()
{
    Beep(0x1FF, 50);
}

А функцию main вызываешь, как WinMain - c теми же параметрами.
Она всего лишь передаёт управление WinMain.  

Это сообщение отредактировал(а) 586 - 15.7.2006, 21:56
PM   Вверх
586
Дата 15.7.2006, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Цитата(586 @  15.7.2006,  22:21 Найти цитируемый пост)
Цитата(MoZy @  15.7.2006,  22:07 )
Кстати, с импортом функций проблем не будет?

Не должно.

А проблемы оказываются есть. Если в функции WinMain прописать какую-нибудь функцию, она обращается в таблицу импорта exe. Вызываюшего exe, а не самого себя. Происходит ошибка. 
PM   Вверх
586
Дата 15.7.2006, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Попробовал вот что:
Код
#include <windows.h>
#pragma comment (linker, "/DLL")
#pragma comment (linker, "/base:0x1000000")

extern "C"
{
 __declspec(dllexport) int Function1(char*);
 __declspec(dllexport) void Function2();
 __declspec(dllexport) void main(HINSTANCE p1, HINSTANCE p2, LPSTR p3, int p4){WinMain(p1, p2, p3, p4);};
}

int __stdcall WinMain(HINSTANCE, HINSTANCE, char*, int)
{
    MessageBoxA(0, "Hello world", 0, 64);
    return 0;
}

int Function1(char* str)
{
 return MessageBoxA(0, str, 0, 0);
}

void Function2()
{
    Beep(0x1FF, 50);
}

Работает хорошо, но exe-шник сам запускаться не хочет.
Делай DLL!!! 
PM   Вверх
MoZy
Дата 16.7.2006, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

Репутация: 1
Всего: 0



Спасибо, 586. Я все именно так и сделал. Но у меня возникли проблемы (в том числе и с пониманием сути вещей):

1. Если где-либо (хоть в WinProc, хоть в WinMain хоста) прописать что-либо (Beep или MessageBox) после вызова функции ModuleWinMain (или main как в твоем примере, 586), то это самое после сработает после того, как отдестроится окошко модуля. В чем прикол?

2. Если в хосте прописать FreeLibrary(Module_hInst), без предварительной команды модулю закрыть себя, то вылазит ошибка. Вопрос: это нормально?

3. Если же отдестроить окно хоста (то есть PostQuitMessage(0)) не делая выше сказанное, то:
а) модуль продолжит свою работу;
б) каким-то чудом хост будет попрежнему принимать сообщения от модуля и реагировать на них*

*В модуле я по таймеру шлю сообщение хосту, а тот на это сообщение реагирует звуковым сигналом.

Растолкуйте, пожалуйста, всю эту муть. 
--------------------
Experimentia est optima rerum magistra
PM MAIL WWW ICQ   Вверх
586
Дата 16.7.2006, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Цитата(MoZy @  16.7.2006,  19:15 Найти цитируемый пост)
1. Если где-либо (хоть в WinProc, хоть в WinMain хоста) прописать что-либо (Beep или MessageBox) после вызова функции ModuleWinMain (или main как в твоем примере, 586), то это самое после сработает после того, как отдестроится окошко модуля. В чем прикол?
В том, что код застревает в цикле обработки сообщений GetMessage. Так и должно быть.

Цитата(MoZy @  16.7.2006,  19:15 Найти цитируемый пост)
Если в хосте прописать FreeLibrary(Module_hInst), без предварительной команды модулю закрыть себя, то вылазит ошибка. Вопрос: это нормально?
Нормально. Вында обращается к функции WindowProc, а она находится в выгруженном exe. Происходит ошибка 0xC0000005.

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

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


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

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


 




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


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

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