Gość Opublikowano 11 Grudnia 2009 Udostępnij Opublikowano 11 Grudnia 2009 Witam :) Ostatnio właśnie próbowałem coś wykrzesać do GM'a (okienka od Windowsa, nie od GM'a) i mam to proste ShowMessage. I mam taki problem, bo jak mam kod: function Wiadomosc(): pchar; stdcall; begin ShowMessage('Jakiś tam tekst'); end; exports Wiadomosc; begin end. I później w GM'ie dam że ma tą funkcję odczytać: GML Message = external_define(global._DLL_Name, "Wiadomosc", dll_stdcall, ty_string, 0); I wykonam to, to okienko się pokazuje z tym napisem "Jakiś tam tekst". Ale jak zrobię tak: function Wiadomosc(tekst: pchar): pchar; stdcall; begin ShowMessage(tekst); end; exports Wiadomosc; begin end. I w GM'ie dam taki skrypt: GML Message = external_define(global._DLL_Name, "Wiadomosc", dll_stdcall, ty_string, 1, ty_string); GML //Skrypt DLL_Mess external_call(Message, argument0); A w obiekcie dam: GML DLL_Mess("tekst");To nie wyświetla "tekst" tylko same kwadraty. Dodam, że w kompilatorze/debuggerze jest ostrzeżenie "[DCC Warning] TestDLL.dpr(32): W1035 Return value of function 'Wiadomosc' might be undefined". Ale nie wiem jak zdefiniować zwracaną wartość ? O ile dobrze przetłumaczyłem :P Czy idzie to jakoś zrobić, żeby wyświetlało te znaki ? Z góry dzięki :) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
PsichiX Opublikowano 11 Grudnia 2009 Udostępnij Opublikowano 11 Grudnia 2009 nie zwracasz żadnej wartości, mimo iż masz to zdeklarowane w GMie. musisz zawsze coś zwracać, aby GM nie sypał błędami - jeśli nie zwracasz nic szczególnego, niech zwraca real rowny 1 lub 0, lub konkretna wartosc jesli cos musi zwrocic funkcja. i nie pomyl typow. bo widze ze masz zwracanie stringa zadeklarowane w GMie, wiec albo zamien to na ty_real i zwroc 1, albo zwracaj jakis pusty string w DLLce (pierwsza opcja lepsza) function Wiadomosc(tekst: pchar): real; stdcall; begin ShowMessage(tekst); result:=1; end; GML Message = external_define(global._DLL_Name, "Wiadomosc", dll_stdcall, ty_real, 1, ty_string); Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Gość Opublikowano 11 Grudnia 2009 Udostępnij Opublikowano 11 Grudnia 2009 Czy bym skopiował kod, czy bym coś pozmieniał, przepisał, i tak nie wyświetla tekstu, tylko ostatnią literkę, reszta - kwadraciki. Ale dobrze wiedzieć że w taki sposób trzeba coś zwracać ;) Może gdzieś indziej tkwi błąd? W GM'ie raczej nie, bo wszystko jest tak jak napisałem. E: Głównie interesują mnie biblioteki niż programy w Delphi, ale biblioteki pod programy napisane w Delphi wyglądają całkiem inaczej niż te do GM'a. Dlatego pytam :) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
PsichiX Opublikowano 11 Grudnia 2009 Udostępnij Opublikowano 11 Grudnia 2009 zapodaj tresc funkcji ShowMessage() Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Gość Opublikowano 11 Grudnia 2009 Udostępnij Opublikowano 11 Grudnia 2009 W bibliotece jest to: ShowMessage(tekst); Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
PsichiX Opublikowano 11 Grudnia 2009 Udostępnij Opublikowano 11 Grudnia 2009 myslalem ze sam ja napisales ;p mniejsza o to. ShowMessage(const Msg: string); to zobaczylem w dokumentacji. skoro to string to musisz przekonwertowac pchar na stringa i dopiero mu dac jako argument Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Gość Opublikowano 12 Grudnia 2009 Udostępnij Opublikowano 12 Grudnia 2009 Bibliotekę sam pisałem, tyle że tylko to umieściłem. Dzięki, poszukam czegoś :) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Pieter Opublikowano 12 Grudnia 2009 Udostępnij Opublikowano 12 Grudnia 2009 zamiast używać stdcall użyj cdecl... to rozwiąże twój problem. (nie będę się zagłębiał w pointery/pchar/string i w ogóle w dll'e bo i tak byś tego nie zrozumiał). Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Gość Opublikowano 13 Grudnia 2009 Udostępnij Opublikowano 13 Grudnia 2009 Ano dzięki Pieter :) Działa. Mam jeszcze takie jedno pytanie. Mam w bibliotece warunek, że jeśli jest przekazana jakaś wartość, to ma się dane okienko pokazać. Ale mniejsza to, bo w bibliotece wszystko dobrze jest. I mam w GM'ie funkcję (skrypt) Message i w nim taki kod: GML switch (argument2) { case 1: external_call(...); case 2: external_call(...); case 3: external_call(...); } (jak będzie trzeba, to podam tą zawartość). No i jeśli podam argument2 "3", to pokazuje jedno okienko, takie jak ustaliłem w bibliotece i jest dobrze. Ale jak ustawie 2 argument "1" to wyświetla po kolei te 3 warunki, tak jakbym nie miał w ogóle tego switch. Jeśli bez switcha dam jedno external_call z wybraną wartością, to też pokazuje jedno okienko, i jest dobrze. Może trochę nie zrozumiale napisałem. Ale chyba zrozumiecie o co chodzi. No i to pytanie - dlaczego wykonuje skrypt tak, jakby w ogóle tego switch nie było? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ZeroXbot Opublikowano 13 Grudnia 2009 Udostępnij Opublikowano 13 Grudnia 2009 Bo nie dałeś GML break; :| Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Gość Opublikowano 14 Grudnia 2009 Udostępnij Opublikowano 14 Grudnia 2009 Ajj, fakt, nie zauważyłem, mój błąd ;) Dzięki. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto
Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.
Zarejestruj nowe konto
Załóż nowe konto. To bardzo proste!
Zarejestruj sięZaloguj się
Posiadasz już konto? Zaloguj się poniżej.
Zaloguj się