Marek
Kojder
Student Informatyki
Wydziału AEiI na
Politechnice
Śląskiej
Temat: Wstawki asemblerowe w QT
Witam,piszę projekt na zaliczenie, w którym muszę wykorzystać asemblera.
GUI stworzyłem w QT, funkcję asemblerową napisałem w visual studio 2010 i stworzyłem plik *.dll.
A teraz pytanie: jak połączyć to ze sobą, abym mógł korzystać w qt z tej funkcji?
Z góry uprzejmie dziękuję za pomoc :-).
Pozdrawiam.
Krzysztof
Kawa
pomysłowy
programista
Temat: Wstawki asemblerowe w QT
Chyba musisz dokładniej opisać co konkretnie chcesz zrobić. Co to znaczy "korzystać z funkcji w Qt"? Qt to klasy i funkcje, korzysta się z nich tak samo jak z klas i funkcji w samym C++.Jeśli chodzi Ci o załadowanie dll'ki za pomocą Qt i użycie funkcji w niej zawartych to służy do tego klasa QLibrary, będąca obiektowym wrapperem na systemowe LoadLibrary() i GetProcAddress(). Działa to mniej więcej tak:
typedef void (*MyAsmFunction)();
QLibrary lib("myAsmLibrary.dll");
MyAsmFunction func = (MyAsmFunction)lib.resolve("myAsmFunctionName");
if(func) func();
Marek
Kojder
Student Informatyki
Wydziału AEiI na
Politechnice
Śląskiej
Temat: Wstawki asemblerowe w QT
Dziękuję za zainteresowanie :-).Miałem na myśli dokładnie to co napisałeś. Sprawdziłem podany przez Ciebie kod i niestety mi nie działa.
Sprawdziłem czy program widzi moją bibliotekę dll. Metoda:
QLibrary::isLibrary("moja.dll"); zwraca true, jednak gdy wywołuję (MyAsmFunction)lib.resolve("nazwaFunkcjiwDLL"); zwraca mi false.Nie mam pojęcia gdzie robię błąd.
Tak wygląda ten fragment kodu w moim programie:
typedef void (*ZmienJasnosc)(int**, int, int, int);
QLibrary lib("zmienjasnosc.dll");
ZmienJasnosc zmien = (ZmienJasnosc)lib.resolve("zmien_jasnosc");
if(zmien) zmien(tmp->tabRed, tmp->X, tmp->Y, proc);
else QMessageBox::information(this, trUtf8("Blad"), trUtf8("Nie mozna zaladowac biblioteki"), "OK");
Za wszelkie sugestie z góry dziękuję :-).Marek Kojder edytował(a) ten post dnia 15.01.12 o godzinie 23:09
Krzysztof
Kawa
pomysłowy
programista
Temat: Wstawki asemblerowe w QT
Jesli sama biblioteka ładuje się poprawnie ,a le nie możesz uzyskać wskaźnika do funkcji to sprawdziłbym najpierw czy dll'ka jest utworzona poprawnie, tzn. czy funkcje w niej zawarte są poprawnie wyeksportowane.Możesz sie do tego posłużyć np. dependency walkerem. Za jego pomocą możesz zobaczyć co i jak jest faktycznie widoczne z dll'ki na zewnątrz.
Pamiętaj też, że funkcja importowana przez QLibrary musi być wyeksportowana jako funkcja C, czyli np. w VS:
extern "C" __declspec(dllexport) void zmien_jasnosc(int**, int, int, int) {...}
