Autor Wątek: Podstawowy kod wtyczki  (Przeczytany 14119 razy)

0 Użytkowników i 1 Gość przegląda ten wątek.

Offline Dziaddu

  • Młodzież
  • **
Podstawowy kod wtyczki
« dnia: Styczeń 24, 2009, 18:43:26 pm »
Projekt naprostszej wtyczki, która przekazuje informacje o sobie komunikatorowi i wyświetla MessageBox przy ładowaniu i wyładowywaniu, stworzony dla Code::Blocks (MinGW):
http://dziaddu.eportal.com.pl/wtw/wtycz ... plugin.zip

W przypadku błędu "illegal byte sequence" należy w ustawieniach edytora zmienić domyślne kodowanie na UTF-8.

------
Oryginalny post:

Kaworu, mógłbyś dorzucić do instalatora kod prostej wtyczki (albo nawet kilku, na wzór SDK z Tlenu)? Próbowałem spłodzić coś samemu (wzorując się na tlenowych wtyczkach), ale próba odpalenia wtw, gdy wtyczka jest w katalogu, kończy się windowsowym komunikatem o błędzie programu.
« Ostatnia zmiana: Styczeń 25, 2009, 22:18:57 pm wysłana przez Dziaddu »

Offline Kaworu

  • Ryszard
  • Szlachta
  • *
  • Twój Koszmar Senny
    • k2t.eu
Re: Podstawowy kod wtyczki
« Odpowiedź #1 dnia: Styczeń 24, 2009, 19:30:12 pm »
Sprawdź zalącznik, tylko jest pod VS/MFC, ale powinieneś się połapać.

Offline Wojciech

  • Narybek
  • *
Re: Podstawowy kod wtyczki
« Odpowiedź #2 dnia: Styczeń 24, 2009, 20:28:25 pm »
A beda inne przykłady? Na inne kompilatory? Delhpi, BCB?

Offline Kaworu

  • Ryszard
  • Szlachta
  • *
  • Twój Koszmar Senny
    • k2t.eu
Re: Podstawowy kod wtyczki
« Odpowiedź #3 dnia: Styczeń 24, 2009, 20:30:12 pm »
Nie, z odrobiną logiki i wiedzy reszta sobie poradzi.

Offline Wojciech

  • Narybek
  • *
Re: Podstawowy kod wtyczki
« Odpowiedź #4 dnia: Styczeń 24, 2009, 20:35:32 pm »
To niedobrze :P

Offline Dziaddu

  • Młodzież
  • **
Re: Podstawowy kod wtyczki
« Odpowiedź #5 dnia: Styczeń 24, 2009, 21:06:48 pm »
A ja sobie nie radzę :P Wychodzi na to, że dobrze kombinowałem, ale mimo to wtyczka albo ma stan na liście wtyczek "Błąd", albo wysypuje komunikator.

Mam coś takiego (wykomentowane linie to inne sposoby, których próbowałem):
#define UNICODE
#define _UNICODE
#include <windows.h>
#include <wtwPlugin.h>


WTWPLUGINFO plugInfo = {
sizeof(WTWPLUGINFO),
L"wtw_basic_plugin",
L"podstawowa struktura wtyczki",
L"(c) 2009",
L"Marcin Lewicz (Dziaddu)",
L"dziaddu2@tlen.pl",
L"dziaddu.eportal.com.pl",
L"",
PLUGIN_API_VERSION,
MAKE_QWORD_VERSION(0, 1, 0, 0),
WTW_CLASS_UTILITY,
NULL,
0,
0,
0,
0
};


//extern "C" WTWPLUGINFO * __stdcall queryPlugInfo(DWORD apiVersion, DWORD masterVersion);
//extern "C" int __stdcall pluginLoad(DWORD callReason, WTWFUNCTIONS *fC);
//extern "C" int __stdcall pluginUnload(DWORD callReason);

//extern "C" __declspec(dllexport) WTWPLUGINFO * queryPlugInfo(DWORD apiVersion, DWORD masterVersion);
//extern "C" __declspec(dllexport) int pluginLoad(DWORD callReason, WTWFUNCTIONS *fC);
//extern "C" __declspec(dllexport) int pluginUnload(DWORD callReason);


WTWPLUGINFO * __stdcall queryPlugInfo(DWORD apiVersion, DWORD masterVersion)
//__declspec(dllexport) WTWPLUGINFO * queryPlugInfo(DWORD apiVersion, DWORD masterVersion)
{
    return &plugInfo;
}

int __stdcall pluginLoad(DWORD callReason, WTWFUNCTIONS *fC)
//__declspec(dllexport) int pluginLoad(DWORD callReason, WTWFUNCTIONS *fC)
{
    return 0;
}

int __stdcall pluginUnload(DWORD callReason)
//__declspec(dllexport) int pluginUnload(DWORD callReason)
{
    return 0;
}
Wydawało mi się, że to powinno działać, ale nie działa. Jeśli wykorzystam opcje z __declspec(dllexport), to dostaję tylko "nieprawidłową operację wykonaną przez program". Czego tu jeszcze brakuje?

Offline Kaworu

  • Ryszard
  • Szlachta
  • *
  • Twój Koszmar Senny
    • k2t.eu
Re: Podstawowy kod wtyczki
« Odpowiedź #6 dnia: Styczeń 24, 2009, 21:14:24 pm »
; wtyczka.def : Declares the module parameters for the DLL.

EXPORTS
queryPlugInfo
pluginLoad
pluginUnload

Może tego? W innym wypadku kompilator może Ci dodać dekoracje do nazw funkcji.

__declspec(dllexport) int pluginLoad(DWORD callReason, WTWFUNCTIONS *fC)

A to jest __cdecl, nic dziwnego, ze się wykłada ;P

Możesz jeszcze próbować dać
__declspec(dllexport) __stdcall
Ale nie paiętam jak wtedy wygladała sprawa z dekoracją.

Offline malcom

  • Młodzież
  • **
    • http://malcom.pl
Re: Podstawowy kod wtyczki
« Odpowiedź #7 dnia: Styczeń 24, 2009, 21:54:58 pm »
Cytat: "Kaworu"
; wtyczka.def : Declares the module parameters for the DLL.

EXPORTS
queryPlugInfo
pluginLoad
pluginUnload
Przeciez do pure C (extern C) nie powinien dodawac prezentow dekoracyjnych ;p
malcom.pl | xime - moj im;p

Offline Dziaddu

  • Młodzież
  • **
Re: Podstawowy kod wtyczki
« Odpowiedź #8 dnia: Styczeń 24, 2009, 21:57:22 pm »
Próbowałem nawet z plikiem def, ale tak, jak napisał Mal, nie jest on potrzebny.

Próbowałem wszystkich kombinacji z __stdcall i __declspec(dllexport) i wygląda na to, że tylko __declspec(dllexport) daje jakąkolwiek reakcję, niestety w postaci wysypania komunikatora... Gdy się doda do tego _stdcall, to znowu nie ma żadnej reakcji (status wtyczki: Błąd).

Offline Kaworu

  • Ryszard
  • Szlachta
  • *
  • Twój Koszmar Senny
    • k2t.eu
Re: Podstawowy kod wtyczki
« Odpowiedź #9 dnia: Styczeń 24, 2009, 22:07:31 pm »
Podrzuć binarkę.

Offline Wojciech

  • Narybek
  • *
Re: Podstawowy kod wtyczki
« Odpowiedź #10 dnia: Styczeń 24, 2009, 22:08:54 pm »
No własnie i teraz kaw zobacz, jezeli taki Marcin w snesie dziaddu nie potrafi sobie porta zrobic, a on mocną głowe ma to inni tez moga miec problemy wiec moim skromnym zdaniem przydałby sie port do tych podstawowych delphi i bcb w snesie przkład. Ja sam bym z BCB skorzystał :P. bo jak dziaddu nie moze to ja tym bardziej nie bede potrafił :P

Offline Dziaddu

  • Młodzież
  • **
Re: Podstawowy kod wtyczki
« Odpowiedź #11 dnia: Styczeń 24, 2009, 22:21:26 pm »
Marcin to tylko amator, o programowaniu wie tyle, ile sobie wygooglał, albo ile mu ktoś podpowiedział ;) Więc to, że Marcin ma problem, o niczym nie świadczy :P

Binarki: http://dziaddu.eportal.com.pl/wtw/bin.zip
Pierwsza to __declspec wysypująca komunikator, druga __stdcall, trzecia __declspec(dllexport) __stdcall, a czwarta to __declspec(dllexport) <zmienna> __stdcall.

Offline Kaworu

  • Ryszard
  • Szlachta
  • *
  • Twój Koszmar Senny
    • k2t.eu
Re: Podstawowy kod wtyczki
« Odpowiedź #12 dnia: Styczeń 24, 2009, 22:22:46 pm »
Nie za bardzo rozumiem co tutejszy problem ma do wersji BCB ;P

A) nie mam BCB
B) nienawidze BCB
C) Nie mam delphi
D) nie znam delphi (poza podstawowymi podstawami)
E) Nienawidze delphi

Offline Kaworu

  • Ryszard
  • Szlachta
  • *
  • Twój Koszmar Senny
    • k2t.eu
Re: Podstawowy kod wtyczki
« Odpowiedź #13 dnia: Styczeń 24, 2009, 22:25:31 pm »
Cytat: "Dziaddu"
Pierwsza to __declspec wysypująca komunikator, druga __stdcall, trzecia __declspec(dllexport) __stdcall, a czwarta to __declspec(dllexport) <zmienna> __stdcall.

Druga, trzecia i czwarta mają dekoracje:

wtw_basic_plugin.plug plugInfo pluginLoad@8 pluginUnload@4 queryPlugInfo@8

Pierwsza to

__cdecl, a ma byc __stdcall.

Offline Dziaddu

  • Młodzież
  • **
Re: Podstawowy kod wtyczki
« Odpowiedź #14 dnia: Styczeń 24, 2009, 22:32:51 pm »
Grrrr... Dlaczego MinGW jest takie głupie? Przecież druga to __stdcall, wszystkie były tworzone z plikiem def.

Offline Kaworu

  • Ryszard
  • Szlachta
  • *
  • Twój Koszmar Senny
    • k2t.eu
Re: Podstawowy kod wtyczki
« Odpowiedź #15 dnia: Styczeń 24, 2009, 22:34:31 pm »
Bo to GCC? Sprawdź extern "C".

Offline Dziaddu

  • Młodzież
  • **
Re: Podstawowy kod wtyczki
« Odpowiedź #16 dnia: Styczeń 24, 2009, 22:40:28 pm »
Z extern "C" też próbowałem ;) Pogooglam trochę, może coś znajdę.

Offline malcom

  • Młodzież
  • **
    • http://malcom.pl
Re: Podstawowy kod wtyczki
« Odpowiedź #17 dnia: Styczeń 24, 2009, 22:41:49 pm »
E, tez jestem Marcin :)

Cytat: "Kaworu"
Nie za bardzo rozumiem co tutejszy problem ma do wersji BCB ;P

A) nie mam BCB
B) nienawidze BCB
C) Nie mam delphi
D) nie znam delphi (poza podstawowymi podstawami)
E) Nienawidze delphi
Wszystkie punkty poprawne.

Cytat: "Dziaddu"
Grrrr... Dlaczego MinGW jest takie głupie? Przecież druga to __stdcall, wszystkie były tworzone z plikiem def.
Sprawdze w wolnej chwili pod gcc.
malcom.pl | xime - moj im;p

Offline Dziaddu

  • Młodzież
  • **
Re: Podstawowy kod wtyczki
« Odpowiedź #18 dnia: Styczeń 25, 2009, 21:11:38 pm »
Jest! Jest! Jest! :D Kto by pomyślał, że tyle czasu zmarnuję, żeby stworzyć sam szkielet wtyczki poprawnie kompilujący się pod Code::Blocks... Rozwiązanie:

Krok 1: Kod
#define UNICODE
#define _UNICODE
#include <windows.h>
#include <wtwPlugin.h>


WTWPLUGINFO plugInfo = {
sizeof(WTWPLUGINFO),
L"wtw_basic_plugin",
L"Podstawowa struktura wtyczki",
L"(c) 2009",
L"Marcin Lewicz (Dziaddu)",
L"dziaddu2@tlen.pl",
L"dziaddu.eportal.com.pl",
L"",
PLUGIN_API_VERSION,
MAKE_QWORD_VERSION(0, 1, 0, 0),
WTW_CLASS_UTILITY,
NULL,
0,
0,
0,
0
};


extern "C" __declspec(dllexport) WTWPLUGINFO * _stdcall queryPlugInfo(DWORD apiVersion, DWORD masterVersion);
extern "C" __declspec(dllexport) int _stdcall pluginLoad(DWORD callReason, WTWFUNCTIONS *fC);
extern "C" __declspec(dllexport) int _stdcall pluginUnload(DWORD callReason);


__declspec(dllexport) WTWPLUGINFO * _stdcall queryPlugInfo(DWORD apiVersion, DWORD masterVersion)
{
    return &plugInfo;
}

__declspec(dllexport) int _stdcall pluginLoad(DWORD callReason, WTWFUNCTIONS *fC)
{
    return 0;
}

__declspec(dllexport) int _stdcall pluginUnload(DWORD callReason)
{
    return 0;
}
Czym różni się od wcześniejszych prób? stdcall ma pojedynczy podkreślnik. Przed chwilą to wykombinowałem :]

Krok 2: Menu Project -> Build options... -> zakładka Linker settings -> pole Other linker options -> -Wl,--kill-at
Co to robi? Coś takiego (taka będzie zawartość pliku def, jeśli zaznaczymy, że ma się generować automatycznie):
EXPORTS
    pluginLoad = pluginLoad@8 @1
    pluginUnload = pluginUnload@4 @2
    queryPlugInfo = queryPlugInfo@8 @3
Gdybym od razu zaczął od kombinowania z inną ilością podkreślników przed stdcall, oszczędziłbym ze 4h męczarni, bo --kill-at wygooglałem sobie dosyć szybko, ale nie działał z __stdcall.

Offline n3oo

Re: Podstawowy kod wtyczki
« Odpowiedź #19 dnia: Styczeń 27, 2009, 16:02:54 pm »
@kaw: a dało by rade udostępić ten base_plug w formie w której się od razu kompiluje (bez kwiatków) ? :P próbuje pod VS 2008 i już poprawiłem nawet błędne odwołania do nagłówków, skopiowałem API do folderu do którego są odwołania w projekcie :P ale nadal brakuje  "/libUI/interface.h" z pliku WndOptionsS.h :)
Env: Win7 x64 / WinXP x86 | GG: 670035 | WWW: Portfolio