Witam!
Mam takie pytanie, jak zrobić coś podobnego do systemowego rundll32, tylko z oknami?
Nie chodzi mi o gotowy kod, a tylko o czystą teorię, resztą się sam zajmę.
PS. Czy mi się wydaje, czy wstawki Assemblera są nieuniknione?
Witam!
Mam takie pytanie, jak zrobić coś podobnego do systemowego rundll32, tylko z oknami?
Nie chodzi mi o gotowy kod, a tylko o czystą teorię, resztą się sam zajmę.
PS. Czy mi się wydaje, czy wstawki Assemblera są nieuniknione?
Assembler? Do czego?! Jak z oknami? Rundll32 odpala z podanej jako argument dll'ki funkcję będącą argumentem po przecinku. LoadLibrary + GetProcAddress + wywołanie funkcji z tego... Proto funkcji takie jak WinMain, lpszCmdLine to reszta linii poleceń po nazwie funkcji. Gdzie tu widzisz zastosowanie dla assemblera? W cywilizowanym świecie assemblera się praktycznie w ogóle nie używa za wyjątkiem niektórych cudów związanych z bezpieczeństwem i ew. programowaniem systemów wbudowanych....
te okna które wyskakują przy wywołaniu niektórych dll'ek przez rondlla są tworzone przez same dll'ki ( tak samo możesz mieć okienka w pluginie do czegoś )
prostym sposobem jest dodanie Forms do uses
i wstawienie do głównego pliku dll'ki czegoś takiego
begin
Application.Initialize();
Application.Run();
end.
jak będziesz dodawać formy do projektu ( robiłem tak na D7 - za inne nie ręczę =) ) Delphi samo dopisze pomiędzy Initialize i Run ich tworzenie ( czasem też inne bzdety ) =)
więc otrzymasz aplikację udającą dll'kę =)
Jak z oknami? Chodziło po prostu o interfejs. Wiem jak działa rundll32.
Po co assembler? Ja tak myślę, jak by tu przekazać parametry funkcji mając tylko nazwę biblioteki i funkcji? Wydaje mi się, że do tego potrzebne będzie choćby wstawka w stylu
asm
push arg
end;
, chyba, że znasz jakiś sposób na poznanie parametrów funkcji mając tylko to.
Jeżeli robić coś co działa dokładnie jak rundll32, to proste, byłoby to LoadLibrary, GetProcAddress i najzwyklejsze wywołanie, tylko chciałbym dać możliwość podania parametrów...
@up: offtop totalny. Ja tu mówię o wywoływaniu funkcji z parametrami mając tylko nazwę dll'a i funkcji...
A jak Ty to sobie wyobrażasz? Jak przekażesz argumenty do funkcji? W ogóle jak je zapiszesz?
push arg4
push arg3
push arg2
push arg1
I teraz wywołam funkcję.
Użyszkodnik będzie podawał ilość argumentów i wartość każdego, w każdym razie jak próbowałem pobrać wskaźnik na MessageBoxA i podawałem argumenty tak :
//zakładam że str to PChar i już tam siedzi tekst : 'haha'
//tu było LoadLibrary i GetProcAddress, chyba mało ważne jak mówimy o przekazywaniu argumentów
asm //no i wchodzimy
push 0 //ma być MB_OK
push 0 //tytuł niech będzie 0
push str //przekazujemy wskaźnik na string
push 0 //uchwyt okna olewamy
call Proc //zakładam że proc to wskaźnik na funkcję
end;
I się posłusznie wyświetlał MessageBox z tekstem haha. Taki mam pomysł, nie wiem tylko czy dobry.
Nie zrozumiałeś mnie, wyobraź sobie, że takie rzeczy to wiem. Jak chcesz zapisać w linii poleceń\GUI swojego programu listę argumentów, ich typów i wartości...
To Twoje działa wyłącznie dla funkcji w stdcall, czteroargumentowych, tutaj spokojnie można się bez assemblera obyć...
Ok, przepraszam.
Ilość argumentów będzie w (Jv)SpinEdit, kolejne argumenty w EDITach, ich typy w RadioGroupach lub SpeedButtonach. Konwencja wywołania to też najpewniej RadioGroup. Teraz jasne?
Tamto to był tylko przykład radzenia sobie z MessageBoxem, wejdzie pełno case'ów pilnujących typy i ilość argumentów, to wiadomo.
A, wiem że się czepiam, ale dla cdecl też zadziała ;P
Jak już miałbym się mieszać to raczej użyłbym ListView do całości... hm, fakt, assembler się może przydać... jedna pętla + tablica z klamotami do wrzucenia. Najpierw zrób to całe GUI i zrzucenie do postaci tablicy + konwersje wartości to się pobawimy.
dopisane: Dla cdecl działa przez przypadek, w stdcall wywoływany usuwa argumenty, w cdecl wywołujący - nie wysypało się tylko dlatego, że zaraz potem funkcja zwija ramkę stosu i się kończy...
ListView jednak mi nie pasuje, jakoś nie umiem go doprowadzić do możliwości edycji ;P, zostanę przy moim pomyśle.
Jeszcze coś, jedyne typu które będą to DWORD i PChar, więc konwersja prosta, w przypadku DWORDa IntToStr, dla PChara rzutowanie, i można wrzucić do jednej tablicy, bo to raczej to samo ;P.
Eee... Konwencje wywołania to cdecl, stdcall, pascal i fastcall, tak?
Tja, dla edycji ListView dałbym oddzielnego dialoga po dblclick.
rundll to "pomocniczy" programik wspierajacy uruchamianie np jakis dll - mimo ze nie programuje od dawna to mysle ze zwykle shellexecute by spielniao role ... a z tym asemblerem to jakis manfredek natarczywy jest... wszedzie go wcisnac chce ... a po h*** ? :) pozdro
Człowieku, ja chcę zrobić program działający podobnie do rundll, tylko z możliwością podania parametrów do funkcji, więc ShellExecute mi g**** da...
A jeżeli widzisz jakąś możliwość zrobienia tego bez Assemblera to proszę, oświeć mnie... A, chyba pierwszy raz używam assemblera w innym miejscu niż robienie czegokolwiek w MASM, więc jakie wszędzie?
dać dll'ce jeden ciąg z którego sama sobie wyrwie argumenty, chyba że chcesz to uniwersalne zrobić ( nie tylko dla swoich dll'ek ) ?