Создание формы в DLL
Задача следующая. Необходимо при запуске DLL (открытии или запуске функции) создавать и использовать форму. Подскажите как это сделать и желательно пример.
Я обычно делаю так:
добавляю форму в DLL обычным образом,
создаю некоторую функцию в DLL, котороя создает форму и возвращает на нее указатель
и все, собственно.
Включаешь H-файл формы и LIB в главный проект и можете пользоваться.
Сразу сообщу несколько билдеровских косяков, связанных с формой в DLL, если узнаешь как лечится, сообщай
1) при помещении формы в DLL и включении LIB в главный проект, каждая форма программы при открытии(независимо от того где она находится) создает свою кнопку на панели задач
2) главная форма программы иногда теряет способность сворачиваться, при нажатии сисстемной кнопки "Свернуть"
можнт еще чего есть по мелочи, сейчас не упомню
Я обычно делаю так:
добавляю форму в DLL обычным образом,
создаю некоторую функцию в DLL, котороя создает форму и возвращает на нее указатель
и все, собственно.
Включаешь H-файл формы и LIB в главный проект и можете пользоваться.
Сразу сообщу несколько билдеровских косяков, связанных с формой в DLL, если узнаешь как лечится, сообщай
1) при помещении формы в DLL и включении LIB в главный проект, каждая форма программы при открытии(независимо от того где она находится) создает свою кнопку на панели задач
2) главная форма программы иногда теряет способность сворачиваться, при нажатии сисстемной кнопки "Свернуть"
можнт еще чего есть по мелочи, сейчас не упомню
Если можешь скинь пример. PLS.
[email]mikeshilkin@nm.ru[/email]
Сразу сообщу несколько билдеровских косяков, связанных с формой в DLL, если узнаешь как лечится, сообщай
1) при помещении формы в DLL и включении LIB в главный проект, каждая форма программы при открытии(независимо от того где она находится) создает свою кнопку на панели задач
2) главная форма программы иногда теряет способность сворачиваться, при нажатии сисстемной кнопки "Свернуть"
можнт еще чего есть по мелочи, сейчас не упомню
Глюки эти, ИМХО, не билдера. Судя по всему, тебе в твою дельку надо передать указатель на экзепляр приложения в котором форма создается...К сожалению не могу счас кинуть работающий примерчик, попаду домой - сделаю...:)
Unit.cpp
//------
#include <vcl.h>
#pragma hdrstop
#include "Unit.h"
#include "Form1.h"
HWND ShowDllForm()
{
TForm1 *Form1 = new TForm1();
Form1->Show();
return Form1->Handle;
}
#pragma package(smart_init)
//--------
Unit.h
//--------
#ifndef UnitH
#define UnitH
extern "C" __declspec(dllexport) HWND ShowDllForm();
#endif
//---------------------
ну и потом в ней же(dll) создаешь форму Form1. Компилить надо с Use RTL и Build with runtime packages.
Создаешь dll в нее добавляешь новый юнит, код этого юнита:
Unit.cpp
//------
#include <vcl.h>
#pragma hdrstop
#include "Unit.h"
#include "Form1.h"
HWND ShowDllForm()
{
TForm1 *Form1 = new TForm1();
Form1->Show();
return Form1->Handle;
}
#pragma package(smart_init)
//--------
Unit.h
//--------
#ifndef UnitH
#define UnitH
extern "C" __declspec(dllexport) HWND ShowDllForm();
#endif
//---------------------
ну и потом в ней же(dll) создаешь форму Form1. Компилить надо с Use RTL и Build with runtime packages.
Пробовал делать как ты написал - та же фигня, и главное окно не сворачивается и для каждой формы из DLL отдельная кнопка в панели задач.
Можесь скинуть пример в котором этих косяков нет?
mailto:_kolyan@ngs.ru
И еще вопросик
что такое extern "C" __declspec(dllexport)
и чем оно отличается от __export?
Пробовал делать как ты написал - та же фигня, и главное окно не сворачивается и для каждой формы из DLL отдельная кнопка в панели задач.
Можесь скинуть пример в котором этих косяков нет?
mailto:_kolyan@ngs.ru
И еще вопросик
что такое extern "C" __declspec(dllexport)
и чем оно отличается от __export?
Лови здесь, компилить надо и прогу и dll ки с Use dynamic RTL (закладка Linker) и Build with runtime Packages (Packages) включёнными!!
Лови здесь, компилить надо и прогу и dll ки с Use dynamic RTL (закладка Linker) и Build with runtime Packages (Packages) включёнными!!
Спасибо за пример, все работает.
я, правда, подкулюча библиотеки немного по другому, может потому оно и криво работает.
А все-таки что такое
extern "C" __declspec(dllexport) ?
Спасибо за пример, все работает.
я, правда, подкулюча библиотеки немного по другому, может потому оно и криво работает.
А все-таки что такое
extern "C" __declspec(dllexport) ?
Продаю алгоритм, недорого, 2 бутылки пива "Stella Artois".
Открываешь Билдер, нажимаешь F1, вводишь "extern" читаешь:
Use the extern modifier to indicate that the actual storage and initial value of a variable, or body of a function, is defined in a separate source code module. Functions declared with extern are visible throughout all source files in a program, unless you redefine the function as static.
The keyword extern is optional for a function prototype.
Use extern "c" to prevent function names from being mangled in C++ programs.
КРатко переводя на русский соглашение об использовании имен и размешении тела функции.
Продаю алгоритм, недорого, 2 бутылки пива "Stella Artois".
Открываешь Билдер, нажимаешь F1, вводишь "extern" читаешь:
Use the extern modifier to indicate that the actual storage and initial value of a variable, or body of a function, is defined in a separate source code module. Functions declared with extern are visible throughout all source files in a program, unless you redefine the function as static.
The keyword extern is optional for a function prototype.
Use extern "c" to prevent function names from being mangled in C++ programs.
КРатко переводя на русский соглашение об использовании имен и размешении тела функции.
Спасибо!!!
Правда перевод на русский язак был совершенно излишним.
Я даже сделал как ты сказал: нажал F1 ввел __declspec и получил ответ на вторую половину вопроса!
:D