Mam problem z działaniem na klasach w VC++ 2009 Express Edition. Otóż kroki, które poczyniłem, były zawiłe i nic nie dały, tak więc zacznę i poprzestanę na samym początku.
Otóż chciałem stworzyć plik DLL, który zawiera w sobie klasę Windows Forms. Wszystko było cacy, dopóki nie próbowałem w pliku dllmain.cpp wywołać tę klasę. Żaden znany mi z BCB zapis nie pomógł. Nie wiem, czy wybieram źle: DLL zamiast Class Library, Windows Forms jako nowa klasa, czy Windows Forms UI jako new item. Proszę o jakiś prosty przykład jak zrobić DLL (bez eksportów), który zawiera w sobie pustą Formę i pozwala ją wywołać.
Windows Forms to klasa .NET Frameworku, więc jeśli piszesz natywną DLL-kę to dlatego nie działa.
Przypuszczam, że tworzysz okno na instancji DLL-ki więc to dlatego nie działa. DLL nie może mieć okna. Musisz jakoś dostać instancje(WINAPI - HINSTANCE) aplikacji i na niej stworzy okno.
Hmm, przyznaję się bez bicia, że jestem raczej mało zaawansowanym użytkownikiem, a pojęcie instancji jest dla mnie nowe. Mógłbyś jakoś przybliżyć jak mógłbym to zrobić? Czy to znaczy, że muszę okienka zawrzeć w głównym programie, czy mogę jakoś je zagnieździć w DLL? Jeśli tak, to pod jakim hasłem szukać?
i działało. Nie wiem tylko, czemu tutaj wysypują się błędy z “namespaces” i wiele innych. To faktycznie jest kwestia klasy? Przecież Windows Forms UI jest dostępne specjalnie dla szablonu DLL w VC++ 2008. I to mnie dziwi. Reszta, jak ładowanie i wyładowanie DLL to nie problem. Tylko nie dałem rady przez długi czas wygooglać jak się w VC++ wywołuje klasy w DLL (z naciskiem na Windows Forms).
No a jak się ma wywoływać? Tak jak w C++… Nie dziwie się, że wywala Ci błędy z przestrzeniami nazw. W bibliotekach MS jest wszystko ładnie pogrupowane(no, może z wyjątkiem WinAPI, ale IMHO i tak jest lepiej niż w biblioteka C) w namespace’ach. Musisz wywołać using namespace NazwaPrzestrzeni; albo odnieść się do klasy w “nazwie” wpisując przestrzeń(przestrzenie) w jakich się znajduje.
Okay, ale nawet po konsultacji z kolegą, który jest znacznie lepszy w te klocki obsługiwał bez problemu DLL-ki w WinAPI czystym i RAD-zie od BCB, nadal nie wiemy, skąd te błędy się brały. Bo zrobiliśmy niewiele:
Zakładam nowy projekt - wybieram DLL z Win32 Project (działa)
Dodaję formę Windows Forms, albo jako New Item -> Windows Form UI, albo New Class -> Windows Forms (działa)
Chcąc utworzyć ją w DllMain dołączasz nagłówek do dllmain.cpp (działa)
Tworzę wskaźnik (nawet nie próbuję wywołać) - NIE DZIAŁA
Zdaję sobie sprawę z tego, że wyjaśnienie może być banalne, ale nie byliśmy w stanie znaleźć nic, co by to wyjaśniało. Może mi ktoś wyjaśnić czemu to nie działa i dać jakieś namiary, gdzie jest objaśniony poprawny sposób? Byłbym wdzięczny. Dzięki za wszystkie przyszłe i przeszłe odpowiedzi.
// dllmain.cpp : Defines the entry point for the DLL application.
#include "stdafx.h"
#include "Okno.h"
KlasaOkna *Okno;
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
A tak wyglądają błędy przy próbie kompilacji:
1>Compiling...
1>dllmain.cpp
1>c:\documents and settings\whizzkid\desktop\testlib\testdll\testdll\Okno.h(3) : error C2871: 'System' : a namespace with this name does not exist
1>c:\documents and settings\whizzkid\desktop\testlib\testdll\testdll\Okno.h(4) : error C2653: 'System' : is not a class or namespace name
1>c:\documents and settings\whizzkid\desktop\testlib\testdll\testdll\Okno.h(4) : error C2871: 'ComponentModel' : a namespace with this name does not exist
1>c:\documents and settings\whizzkid\desktop\testlib\testdll\testdll\Okno.h(5) : error C2653: 'System' : is not a class or namespace name
1>c:\documents and settings\whizzkid\desktop\testlib\testdll\testdll\Okno.h(5) : error C2871: 'Collections' : a namespace with this name does not exist
1>c:\documents and settings\whizzkid\desktop\testlib\testdll\testdll\Okno.h(6) : error C2653: 'System' : is not a class or namespace name
1>c:\documents and settings\whizzkid\desktop\testlib\testdll\testdll\Okno.h(6) : error C2871: 'Forms' : a namespace with this name does not exist
1>c:\documents and settings\whizzkid\desktop\testlib\testdll\testdll\Okno.h(7) : error C2653: 'System' : is not a class or namespace name
1>c:\documents and settings\whizzkid\desktop\testlib\testdll\testdll\Okno.h(7) : error C2871: 'Data' : a namespace with this name does not exist
1>c:\documents and settings\whizzkid\desktop\testlib\testdll\testdll\Okno.h(8) : error C2653: 'System' : is not a class or namespace name
1>c:\documents and settings\whizzkid\desktop\testlib\testdll\testdll\Okno.h(8) : error C2871: 'Drawing' : a namespace with this name does not exist
1>c:\documents and settings\whizzkid\desktop\testlib\testdll\testdll\Okno.h(22) : error C2059: syntax error : 'public'
1>c:\documents and settings\whizzkid\desktop\testlib\testdll\testdll\Okno.h(22) : error C2059: syntax error : 'public'
1>c:\documents and settings\whizzkid\desktop\testlib\testdll\testdll\Okno.h(22) : error C2653: 'System' : is not a class or namespace name
1>c:\documents and settings\whizzkid\desktop\testlib\testdll\testdll\Okno.h(23) : error C2143: syntax error : missing ';' before '{'
1>c:\documents and settings\whizzkid\desktop\testlib\testdll\testdll\Okno.h(23) : error C2447: '{' : missing function header (old-style formal list?)
1>.\dllmain.cpp(5) : error C2143: syntax error : missing ';' before '*'
1>.\dllmain.cpp(5) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>.\dllmain.cpp(5) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>Build log was saved at "file://c:\Documents and Settings\WhizzKid\Desktop\testlib\testdll\testdll\Debug\BuildLog.htm"
1>testdll - 19 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Ale innych nie ma! A te wszystkie przestrzenie nazw są zawarte w Okno.h… I bądź tu człowieku mądry… Na innych forach ludzie też nie wiedzą co z tym zrobić, a przecież to musi być możliwe. Piwo dla tego, kto mi powie, jak zrobić DLL z Windows Forms do uruchomienia…