| |
|
|
- Página 1 - |
|
Uwe ''Pascal'' Niemeier | Hi Personas!
In el Hoffnung, daß hier el una u otros ASM-Kenner mitliest, lugar Yo veces 'ne Cuestión:
Yo búsqueda una Möglichkeit, una StdCall-Función con cualquier vielen Parametern aufzurufen. Das el grundsätzlich posible es, zeigt dieses Snippet:
Das klappt sowohl como Función en uno dll como auch como "Embedded ASM" direkt en Profano:
window 800,600
declarar 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
imprimir call(a#,1)
imprimir call(a#,1,2)
imprimir call(a#,1,2,3)
imprimir call(a#,1,2,3,4)
waitinput
Nun denke Yo aber, lo debería auch einfacher y universeller ir, indem uno por verbiegen de Pointern con un einfachen RET auskommt y se el Bandwurm de IF-Abfragen sparen kann (RET akzeptiert sí no Register como Parámetro). Stehe como allerdings algo en el Schlauch, qué Stack-Manipulationen betrifft.
Kann alguien helfen?
[OFFTOPIC]BTW: @ IF: Hab's irgendwie no hingekriegt, dieses Posting bajo "Assembler" abzulegen [/OFFTOPIC]
SeeYou Pascal |
|
|
| |
|
|
|
« Dieser Contribución wurde como Solución gekennzeichnet. » |
|
| ¡Hola Uwe, es gelungen...
o
o
Ablauf fehlerfrei getestet bajo 32Bit WinXP XProfan 11.
Man muss sólo el Rücksprungandresse sichern y esta después de künstlichem Reduzieren des Stacks a el neue Stackposition ablegen.
Würde mich freuen si así algo anfangen kannst. |
|
|
| |
|
|
|
|
| Yo glaube Yo saber ya cómo hacerlo ... Yo teste el heute Abend igual veces y berichte. (sin Ifs, Schleifen y jmp eax*sonstwas)
[OFFTOPIC]Hab el Topic por DB después de Ensamblador movido. Als Yo eben probierte aquí en bajo Ensamblador Topics a erzeugen (auch gleichnamige) funktionierte el problemlos. Was genau war passiert el se el Thema hier no ablegen ließ?[/OFFTOPIC] |
|
|
| |
|
|
|
| ¡Hola Uwe, es gelungen...
o
o
Ablauf fehlerfrei getestet bajo 32Bit WinXP XProfan 11.
Man muss sólo el Rücksprungandresse sichern y esta después de künstlichem Reduzieren des Stacks a el neue Stackposition ablegen.
Würde mich freuen si así algo anfangen kannst. |
|
|
| |
|
|
|
Uwe ''Pascal'' Niemeier | Hi IF!
Klasse! Haut hin!
El Función se siempre sólo una konstanten Valor zurückgeben, aber eben en cualquier vielen Parametern, unabhängig de deren Inhalt.
Yo voluntad lo una universelle Dummy-Función para OLE-Interfaces remendar (war sí klar ) Leider klappt eben el todavía no, wahrscheinlich porque gerade como mi Berechnung el Rücksprungadresse/Parameterzahl no stimmt. Aber el kriege Yo fuera...
Gracias para deine Ayuda!
PS: Wenn du dies liest ha el Posting geklappt
SeeYou Pascal |
|
|
| |
|
|
|
| Juhu ^ ^
Stumpf dijo reichts scheinbar si al Funktionkopf es en el Stack para ret 0 a präparieren en egal como vielen Params. |
|
|
| |
|
|
|
Uwe ''Pascal'' Niemeier | Apéndice @ IF:
Trotz deiner Solución voluntad Yo esta Technik probablemente no uso puede Anscheinend kann lo vorkommen, daß el Aufrufer ( en mi caso Windows incluso, el el Métodos meines Interfaces aufruft ) antes el Funktionsaufruf Werte para el Eigenbedarf en el Stack pusht, el nada como Parámetro para el Función vorgesehen son. Und así Es el Parameterberechnung por ebp minus esp hinfällig Also es weiterhin nötig, para jede Parameterzahl una propio Dummy-Función bereitzustellen. Aber el Intento war's wert!
SeeYou Pascal |
|
|
| |
|
|
|
| Sorry, como Yo ad hoc auch no Concepto - besonders si la Aufruferfunktion auch con el Stack werkelt.
Yo podría me todavía vorstellen el "Win" el Differenz en solch Fall en un Register mitliefert oder por Stack - como una Abhängigkeit herauszufummeln es aber determinado bastante "irre". |
|
|
| |
|
|
|
| Obwohl...
Si usted veces lauter Longs vom Stack simplemente frech en una Debugviewer puschst ...
vlt. klappts sí si uno más que sólo 1 Largo zurücksichert. |
|
|
| |
|
|
|
Uwe ''Pascal'' Niemeier | Hi IF!
Yo glaube inzwischen no mehr, daß el Ganze machbar es: Jede Método ha nun veces una feste Anzahl Parámetro, y derjenige, el el Métodos bereitstellt (y por lo tanto es sí), ha eben dafür Sorge a tragen, daß esta Parámetro korrekt bearbeitet voluntad. ¿Por qué debería se M$ el Mühe hacer, esta Anzahl irgendwo einzubauen? Und si, wäre lo eben undokumentiert y así seeeehr wackelig...La idea con el MultiParameter-Método es sí en mi Mist gewachsen Außerdem hält se el Aufwand en reciente Technik auch en Grenzen; hier una Versión 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 Parámetro * 4 + "This"-Pointer
volver a&'-----------Fertige Función en el Speicher
'--PS: Mit unos pocos NOP's para Verschieben el Platzhalter paßt alles en 1 Línea con 4 LongInts
ENDPROC'------------------------------------------------------------------
proc GetNewStorage'------------------------------------------GetNewStorage
parámetros IFace&,IStorage&
declarar ILockBytes&
CreateILockBytesOnHGlobal(0,1,addr(ILockBytes&))
StgCreateDocfileOnILockBytes(ILockBytes&,$1012,0,IStorage&)
call(long(long(ILockBytes&,0),8),ILockBytes&)'--ILockBytes::Release
volver &OK
ENDPROC'------------------------------------------------------------------
declarar 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 Expediente$=loadfile$("RTF con Objekten wählen","*.rtf")
Rtf("LoadRTF",Edit&,Expediente$)
mientras que 1
waitinput
caso %umessage=16:romper
endwhile
sendmessage(Edit&,~EM_SETOLECALLBACK,0,0)
destroywindow(Edit&)
disponer VTable#
'--Hier müßten eigendlich todos Métodos-Dummys con ~GlobalFree() freigegeben voluntad
War aber bien, veces otra vez una wenig ASM a üben
SeeYou Pascal |
|
|
| |
|
|