| |
|
|
- page 1 - |
|
Uwe ''Pascal'' Niemeier | Hi gens!
dans qui espoir, qui ici qui une ou bien autre ASM-Kenner mitliest, lieu je la fois 'ne Frage:
je cherche une Possibilité, une StdCall-Funktion avec beliebig vielen Parametern aufzurufen. cela cela grundsätzlich possible ist, zeigt cet Snippet:
cela klappt sowohl comme Funktion dans einer dll comme aussi comme "Embedded ASM" direct dans Profan:
window 800,600
declare a#:dim a#,48
long a#,0=734366549,1088979908,83395421,79824245
long a#,16=-2095256832,91556088,-352319294,217613074
long a#,32=214041973,-2096567552,58003704,4290
imprimer call(a#,1)
imprimer call(a#,1,2)
imprimer call(a#,1,2,3)
imprimer call(a#,1,2,3,4)
waitinput
eh bien denke je mais, es sollte aussi einfacher et universeller aller, indem on par verbiegen de Pointern avec einem einfachen RET auskommt et sich den ténia de IF-Abfragen sparen peux (RET akzeptiert oui aucun Register comme paramètre). Stehe là allerdings quelque chose sur dem Schlauch, quoi Stack-Manipulationen betrifft.
peux quelqu'un aider?
[OFFTOPIC]BTW: @ iF: Hab's irgendwie pas hingekriegt, cet Posting sous "Assembler" abzulegen [/OFFTOPIC]
SeeYou Pascal |
|
|
| |
|
|
|
« cette Beitrag wurde comme Solution gekennzeichnet. » |
|
| allô Uwe, ist gelungen...
ou
ou
le bout correct getestet sous 32Bit WinXP XProfan 11.
on muss arrêt qui Rücksprungandresse sichern et cet pour künstlichem réduire des Stacks à qui neue Stackposition enlever.
Würde mich freuen si Du avec cela quelque chose anfangen peux. |
|
|
| |
|
|
|
|
| je crois je wüsste déjà comment on cela ... je teste cela aujourd'hui soir juste la fois et berichte. (sans Ifs, Schleifen et jmp eax*sonstwas)
[OFFTOPIC]Hab den Topic per DB pour Assembler déménagé. comme je plan probierte ici dans sous Assembler Topics trop erzeugen (aussi gleichnamige) funktionierte cela problemlos. quoi oui c'est ca était passiert cela sich cela Thema ici pas enlever ließ?[/OFFTOPIC] |
|
|
| |
|
|
|
| allô Uwe, ist gelungen...
ou
ou
le bout correct getestet sous 32Bit WinXP XProfan 11.
on muss arrêt qui Rücksprungandresse sichern et cet pour künstlichem réduire des Stacks à qui neue Stackposition enlever.
Würde mich freuen si Du avec cela quelque chose anfangen peux. |
|
|
| |
|
|
|
Uwe ''Pascal'' Niemeier | Hi iF!
super! Haut hin!
qui Funktion soll toujours seulement une konstanten Wert zurückgeben, mais plan chez beliebig vielen Parametern, indépendant de en le contenu.
je veux daraus une universelle Dummy-Funktion pour OLE-Interfaces bricoler (était oui bien sûr ) malheureusement klappt plan le reste pas, wahrscheinlich weil justement là mon Berechnung qui Rücksprungadresse/Parameterzahl pas stimmt. mais cela kriege je raus...
merci pour deine Aider!
PS: si du ca liest hat cela Posting geklappt
SeeYou Pascal |
|
|
| |
|
|
|
| Juhu ^ ^
Stumpf dit reichts scheinbar si am Funktionkopf steht um den Stack pour ret 0 trop präparieren chez égal comment vielen Params. |
|
|
| |
|
|
|
Uwe ''Pascal'' Niemeier | Nachtrag @ iF:
Trotz deiner Solution werde je cet technologie wohl pas verwenden peut Anscheinend peux es vorkommen, qui qui Aufrufer ( dans mon cas Windows selbst, cela qui Methoden meines Interfaces aufruft ) avant dem Funktionsaufruf Werte pour den Eigenbedarf sur den Stack pusht, qui gar pas comme paramètre pour qui Funktion vorgesehen sommes. et avec cela ist qui Parameterberechnung par ebp minus esp hinfällig alors ist es weiterhin nötig, pour chacun Parameterzahl une eigene Dummy-Funktion bereitzustellen. mais den Versuch war's wert!
SeeYou Pascal |
|
|
| |
|
|
|
| Sorry, là habe je ad hoc aussi aucun concept - besonders si le Aufruferfunktion aussi avec dem Stack werkelt.
je pourrait mir encore présenter cela "Win" qui Differenz dans solch le cas dans einem Register mitliefert ou bien per Stack - là une dépendance herauszufummeln ist mais bestimmt assez "irre". |
|
|
| |
|
|
|
| quoique...
si Du la fois lauter Longs vom Stack simple frech dans une Debugviewer puschst ...
vlt. klappts oui si on plus que seulement 1 Long zurücksichert. |
|
|
| |
|
|
|
Uwe ''Pascal'' Niemeier | Hi iF!
je crois inzwischen pas plus, qui cela Ganze machbar ist: chacun Methode hat eh bien la fois une feste Anzahl paramètre, et derjenige, qui qui Methoden bereitstellt (et tout autor ca va oui), hat plan pour Sorge trop tragen, qui cet paramètre korrekt bearbeitet volonté. pourquoi sollte sich M$ qui Mühe faire, cet Anzahl irgendwo einzubauen? et si, wäre es plan undokumentiert et avec cela seeeehr wackelig...L'idée avec qui MultiParameter-Methode ist oui sur meinem Mist gewachsen Aussi hält sich qui Aufwand chez qui bisherigen technologie aussi dans Grenzen; ici une Version des OLE-RTF-Controls:
window 800,600
$H Windows.ph
$H RichEdit.ph
usermessages 16'--WM_CLOSE
def StgCreateDocfileOnILockBytes(4) !"ole32","StgCreateDocfileOnILockBytes"
def CreateILockBytesOnHGlobal(3) !"ole32","CreateILockBytesOnHGlobal"
def &NI $80004001'--Not Implemented
def &OK 0'----------OK
proc CreateIMD'---------------------------------------InterfaceMethodDummy
var a&=~GlobalAlloc(0,8)
byte a&,0=$B8'-------mov eax,&(2)
long a&,1=&(2)'------Rückgabe: vorgegebene Konstante
byte a&,5=$C2'-------ret &(1)*4+4
word a&,6=&(1)*4+4'--Anzahl paramètre * 4 + "This"-Pointer
return a&'-----------Fertige Funktion im grenier
'--PS: avec un paire NOP's zum Déplacer qui Platzhalter paßt alles dans 1 la ligne avec 4 LongInts
endproc'------------------------------------------------------------------
proc GetNewStorage'------------------------------------------GetNewStorage
parameters IFace&,IStorage&
declare ILockBytes&
CreateILockBytesOnHGlobal(0,1,addr(ILockBytes&))
StgCreateDocfileOnILockBytes(ILockBytes&,$1012,0,IStorage&)
call(long(long(ILockBytes&,0),8),ILockBytes&)'--ILockBytes::Release
return &OK
endproc'------------------------------------------------------------------
declare VTable#:dim VTable#,60'-----------------------IRichEditOleCallback-Interface
long VTable#, 0=CreateIMD(1,&NI)'-------------QueryInterface
long VTable#, 4=CreateIMD(0,&NI)'-------------AddRef
long VTable#, 8=CreateIMD(0,&NI)'-------------Release
long VTable#,12=procaddr("GetNewStorage",2)'--GetNewStorage
long VTable#,16=CreateIMD(3,&NI)'-------------GetInPlaceContext
long VTable#,20=CreateIMD(1,&NI)'-------------ShowContainerUI
long VTable#,24=CreateIMD(3,&OK)'-------------QueryInsertObject
long VTable#,28=CreateIMD(1,&NI)'-------------DeleteObject
long VTable#,32=CreateIMD(5,&OK)'-------------QueryAcceptData
long VTable#,36=CreateIMD(1,&NI)'-------------ContextSensitiveHelp
long VTable#,40=CreateIMD(3,&NI)'-------------GetClipboardData
long VTable#,44=CreateIMD(3,&NI)'-------------GetDragDropEffect
long VTable#,48=CreateIMD(4,&NI)'-------------GetContextMenu
long VTable#,52=VTable#
var IFace&=VTable#+52
var Edit&=create("richedit",%hwnd,»,20,20,500,500)
sendmessage(Edit&,~EM_SETOLECALLBACK,0,IFace&)'---EM_SETOLECALLBACK
var Dossier$=loadfile$("RTF avec Objekten wählen","*.rtf")
Rtf("LoadRTF",Edit&,Dossier$)
tandis que 1
waitinput
cas %umessage=16:pause
endwhile
sendmessage(Edit&,~EM_SETOLECALLBACK,0,0)
destroywindow(Edit&)
dispose VTable#
'--ici müßten eigendlich alle Methoden-Dummys avec ~GlobalFree() freigegeben volonté
était mais bien, la fois wieder un peu ASM trop üben
SeeYou Pascal |
|
|
| |
|
|