Skocz do zawartości


Zdjęcie

[C++][MinGW] Problem z testową wtyczką


  • Zaloguj się, aby dodać odpowiedź
2 odpowiedzi w tym temacie

#1 MarWit

MarWit

    Początkujący

  • Użytkownik
  • 2 postów

Napisano 2013.10.02, 22:28

Witam,
niedawno ( znaczy dzisiaj ) naszło mnie na napisanie własnej wtyczki do AQQ. Na początku by trochę pobawić się API napisałem sobie prostego Hello World'a, do którego miałem dodawać kolejne uchwyty na eventy AQQ/callfunc'y, jednakże napotkałem błąd którego też nie mogę pokonać. Po skompilowaniu wtyczki, wrzuceniu do folderu z pluginami i restarcie AQQ, komunikator przestał widzieć połowę moich zainstalowanych wtyczek o mojej nie wspominając. Próbowałem debugować z użyciem argumentu "-log" przy uruchamianiu aplikacji a także używając osobnego debuggera ( w tym przypadku to był Olly i gdb ), aczkolwiek niczego nie znalazłem ( tzw. wygląda na to że wszystko ładuje się poprawnie ).
 
Kod którego użyłem ( proste zadanie: pojawić się w managerze pluginów ): 
#include "main.hpp"

TPluginInfo PluginInfo;

BOOL 
WINAPI DllEntryPoint( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved ) { return 1; }

extern "C" __declspec(dllexport) int __stdcall
Load( PPluginLink Link ) {
	return 0;
}

extern "C" __declspec(dllexport) int __stdcall
Unload( PPluginLink Link ) {
	return 0;
}

extern "C" __declspec(dllexport) PPluginInfo __stdcall
AQQPluginInfo( DWORD AQQVersion ) {
	PluginInfo.cbSize				= sizeof( TPluginInfo );
	PluginInfo.ShortName			= PLUGIN_NAME;
	PluginInfo.Version				= PLUGIN_MAKE_VERSION( 1, 0, 0, 0 );
	PluginInfo.Description			= PLUGIN_DESCRIPTION;
	PluginInfo.Author				= PLUGIN_AUTHOR;
	PluginInfo.AuthorMail			= PLUGIN_AUTHOREMAIL;
	PluginInfo.Copyright			= PLUGIN_COPYRIGHT;
	PluginInfo.Homepage				= PLUGIN_HOMEPAGE;
	
	return & PluginInfo;
}
Wszystkie PLUGIN_* to oczywiscie "const wchar_t *".

Kompilowałem za pomocą G++ w takiej formie:
@echo off
del plugin.dll
g++ -c main.cpp
g++ -shared -Wall -Wextra -o plugin.dll main.o
del main.o
PAUSE


#2 Beherit

Beherit

    In Sorte Diaboli

  • Wtyczkopisarz
  • 5026 postów

Napisano 2013.10.02, 23:08

Jakich nagłówków używasz? Bo nigdzie nie widzę include PluginAPI.h, chyba że zrobiłeś własne w tym main.hpp. Pierwsza sprawa to, że od najnowszej bety AQQ zamiast int należy używać INT_PTR dla Load i Unload (oraz innych, zlookaj moje nagłówki + źródła ostatnio aktualizowanych wtyczek) - w sumie nie ma to żadnego wpływu na wtyczki 32-bitowe ale na 64-bitowe już tak. Poza tym MinGW nie wymaga czasem jakiś dodatkowych bibliotek? Jeżeli tak, to powinny się one znaleźć obok pliku DLL. Odnośnie ładowania pliku DLL sprawdź to programem Dependency Walker :)

#3 MarWit

MarWit

    Początkujący

  • Użytkownik
  • 2 postów

Napisano 2013.10.03, 15:56

Jakich nagłówków używasz?
Bo nigdzie nie widzę include PluginAPI.h, chyba że zrobiłeś własne w tym main.hpp.

windows.h i Twojego przeportowanego PluginAPI ( bo po co wymyślać koło na nowo ). Wszystkie dyrektywy mam w nagłówku.

Poza tym MinGW nie wymaga czasem jakiś dodatkowych bibliotek? Jeżeli tak, to powinny się one znaleźć obok pliku DLL. Odnośnie ładowania pliku DLL sprawdź to programem Dependency Walker :)

Sprawdziłem, wszystko ok, jednak znalazłem inny błąd o którym kompletnie zapomniałem, mianowicie GCC przy używaniu __stdcall dodaje na koniec funkcji "@n", przez co AQQ po prostu nie widział funkcji.
Spoiler


Wystarczyło więc dodać "-Wl,--kill-at" przy kompilacji aby linker nie dodawał niepotrzebnego dopisku, lub stworzyć osobny plik z export'ami. Problem solved.




Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych