Klasy w bibliotekach DLL - VC++ 2008


(Whizz Kid) #1

Witam!

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ć.

Pozdrawiam,

WhizzKid


(Fiołek) #2

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.


(Whizz Kid) #3

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ć?

Pozdrawiam


(somekind) #4

Jeśli nie wiesz co to jest instancja, to raczej zacznij od nauczenia się podstaw najbardziej podstawowych podstaw programowania obiektowego.


(Whizz Kid) #5

W BCB wystarczyło dać w DLL entry point:

  1. include pliku nagłówkowego, który zawiera klasę

  2. wskaźnik: NazwaKlasy *NazwaObiektu

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).


(Fiołek) #6

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.


(Whizz Kid) #7

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:

  1. Zakładam nowy projekt - wybieram DLL z Win32 Project (działa)

  2. Dodaję formę Windows Forms, albo jako New Item -> Windows Form UI, albo New Class -> Windows Forms (działa)

  3. Chcąc utworzyć ją w DllMain dołączasz nagłówek do dllmain.cpp (działa)

  4. 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.

Pozdrawiam


(Fiołek) #8

Dużo nam powiedziałeś... Ja też mogę powiedzieć, że "NIE DZIAŁA" i mi nikt rozwiązania nie poda.

Jakie błędy są? Podaj coś więcej.


(Whizz Kid) #9

Tak wygląda dllmain.cpp:

// 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 ==========

(Fiołek) #10

Akurat dobry plik podałeś... Ale sądząc po błędach, nie dołączyłeś odpowiednich nagłówków.


(Whizz Kid) #11

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...


(Fiołek) #12
1>c:\documents and settings\whizzkid\desktop\testlib\testdll\testdll\Okno.h(3) : error C2871: 'System' : a namespace with this name does not exist

Do jakiego pliku się odnosi? dllmain.cpp? Chyba nie... Podaj kod tamtego pliku.


(Whizz Kid) #13

Ok, dzięki za pomoc, ale udało mi się już znaleźć rozwiązanie :slight_smile:

http://forums.msdn.microsoft.com/en-US/ ... a64f15efe0

Dzięki za zaangażowanie, doceniam :slight_smile: