Odpowiednik rundll32

0

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?

0

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....

0

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ę =)

0

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...

0

A jak Ty to sobie wyobrażasz? Jak przekażesz argumenty do funkcji? W ogóle jak je zapiszesz?

0
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.

0

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ć...

0

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

0

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...

0

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?

0

Tja, dla edycji ListView dałbym oddzielnego dialoga po dblclick.

0

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

0

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?

0

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 ) ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1