Español
Wünsche y Sugerencias

Parameterzahl en DLL-Características erhöhen/conjunto

 

H.Brill
Manchmal reichen el 15 Parámetro sí no.
siehe
oGL("gluLookAt", P1....P19)

de el Glu32.dll

Wenn lo technisch machbar wäre, podría evtl. una SET - Befehl,
el el número angibt o. de/einschaltet hilfreich ser :
SET("DLLParameters", x%)
SET("DLLParameters", 0/1)

Wenn oGL ya el Nutzen el API anbietet, debería auch todos
Características nutzbar ser.

Oder weiß alguien, cómo obiger oGL-Función todavía anders
el 19 Parámetro übergibt ?
 
Benutze XPROFAN X3 + FREEPROFAN
Wir sind die XProfaner.
Sie werden von uns assimiliert.
Widerstand ist zwecklos!
Wir werden alle ihre Funktionen und Algorithmen den unseren hinzufügen.

Was die Borg können, können wir schon lange.
01.08.2023  
 




Jens-Arne
Reumschüssel
Wir haben el Thema ausführlich en Paule's PC-Foro diskutiert - herausgekommen es el hier. Auf esta Weise dejar se cualquier viele Parámetro para una Funktionsaufruf nutzen. Sie voluntad Stück para Stück en el Stack gepusht y luego el Función aufgerufen, el esta Parámetro nutzt.

declarar _params&[],_hGluDll&,_gluLookAtFuncAddr&
declarar eyeX!,eyeY!,eyeZ!,centerX!,centerY!,centerZ!,upX!,upY!,upZ!

ASM "LoopAndCall",3 'hier se el Parameteranzahl con transferencia y uno Bucle abgearbeitet
MOV ECX,Par1 // ECX=Count-Register para el Bucle con el Anzahl Parámetro en el Array invitar, se cada Loop en 1 verringert (Parámetro-Nummer en el Array, el Parámetro necesario rückwärts en el Stack gepusht voluntad [FILO])
// MOV EDX,Par2 // Offset des Array-Speichers en EDX invitar - no nötig, EDX puede wir para de otra manera aufsparen (z.B. para una Multiplikation) y stattdessen simplemente Par2 benutzen
Bucle:
MOV EAX,ECX // aktuellen Schleifenzählerstand (=Nummer des aktuellen Paramters en el Array) en EAX invitar
SUB EAX,1 // EAX=ECX-1 (Speicher-Offset en el Array es nullbasiert)
ADD EAX,EAX // EAX=EAX+EAX --> en el Endeffekt =EAX*2
ADD EAX,EAX // EAX=EAX+EAX --> en el Endeffekt zusammen con el Línea davor =EAX*4 (el es el Offset para el Parámetro en el Array-Speicher)
// así ginge el Multiplikation auch:
// MOV EDX,4
// MUL EDX // multipliziert el Inhalt des EAX-Registers con el Inhalt des EDX-Registers (4) y schreibt el Ergebnis en el EAX-Register zurück
ADD EAX,Par2 //,EDX // Offset des Array-Speicherbereichs a EAX dazuaddieren
MOV EBX,EAX // Speicheradresse en EBX escribir (eigentlich no nötig, aber así es klarer)
MOV EAX,[EBX] // Parámetro a el Speicheradresse en EAX invitar - lo ginge auch MOV EAX,[EAX] (así sería uno EBX para de otra manera aufsparen y podría el Línea hiervor sparen)
PUSH EAX // Parámetro en el Stack pushen
LOOP Bucle // ECX en 1 verringern y zurückspringen, a 0 erreicht es
CALL Par3 // Función aufrufen
ENDASM

cls
_hGluDll&=@usedll("glu32.dll")
_gluLookAtFuncAddr&=@external("kernel32.dll","GetProcAddress",_hGluDll&,"gluLookAt") 'Adresse el aufzurufenden Función ermitteln
_params&[1]=@long(@addr(eyeX!),0)
_params&[2]=@long(@addr(eyeX!),4)
_params&[3]=@long(@addr(eyeY!),0)
_params&[4]=@long(@addr(eyeY!),4)
_params&[5]=@long(@addr(eyeZ!),0)
_params&[6]=@long(@addr(eyeZ!),4)
_params&[7]=@long(@addr(centerX!),0)
_params&[8]=@long(@addr(centerX!),4)
_params&[9]=@long(@addr(centerY!),0)
_params&[10]=@long(@addr(centerY!),4)
_params&[11]=@long(@addr(centerZ!),0)
_params&[12]=@long(@addr(centerZ!),4)
_params&[13]=@long(@addr(upX!),0)
_params&[14]=@long(@addr(upX!),4)
_params&[15]=@long(@addr(upY!),0)
_params&[16]=@long(@addr(upY!),4)
_params&[17]=@long(@addr(upZ!),0)
_params&[18]=@long(@addr(upZ!),4)
imprimir LoopAndCall(18,@addr(_params&[1]),_gluLookAtFuncAddr&) '1. Parámetro: Anzahl Parámetro, 2. Parámetro: Adresse des Parámetro-Arrays, 3. Parámetro: Funktionsadresse
waitinput
freedll _hGluDll&
end

Bitte verzeiht me el Ensamblador-Code, Yo todavía nie (sic!) irgendetwas Sinnvolles en Ensamblador zustandebekommen, obwohl Yo oft intenta habe. Aus diesem Grund Yo el así intensiv y vermutlich muy laienhaft kommentiert. Wahrscheinlich sería alguien, el se así wirklich auskennt, el eleganter hacer, pero funktioniert.

Beste Grüße, Jens-Arne
 
XProfan X4 * Prf2Cpp * XPSE * JRPC3 * Win11 Pro 64bit * PC i7-7700K@4,2GHz, 32 GB RAM
PM: jreumsc@web.de
04.08.2023  
 




Jens-Arne
Reumschüssel
So, y kann me ahora Por favor, irgendjemand erklären, como ser kann, dass gluLookAt en glu32.dll neun *Float*-Werte como Parámetro esperado, el 64 bit breit son? Jeder 32-bit-Compiler übergibt 32-bit-Werte como Parámetro en el Stack. Como se porque algo como sin unseren mühsamen Workaround-Murks oben Por favor, ir? Das kann Yo überhaupt no begreifen.

Siehe  [...] 

Saludo, Jens-Arne
 
XProfan X4
XProfan X4 * Prf2Cpp * XPSE * JRPC3 * Win11 Pro 64bit * PC i7-7700K@4,2GHz, 32 GB RAM
PM: jreumsc@web.de
04.08.2023  
 




Sven
Bader
Auch hier una vez más danke para deine tolle Ensamblador Función!

In el OpenGL DLL es jede Función mehrfach enthalten para 2, manchmal 5 Datentypen. Das sieht el así de:

glTranslatef() para 32 Bit Float
glTranslated() para 64 Bit Float

El Función entspricht el XProfan ogl("move",x,y,z)

glu scheint dieses Anatz no a verfolgen y nimmt entonces en el Zweifel más veces Double, qué natürlich en el 3D-Kontext no falso es.
 
05.08.2023  
 




Jens-Arne
Reumschüssel
Yo habe el ASM-Función para el verschiedenen Calling-Conventions generalisiert, sodass así jede erdenkliche 32-bit-DLL bedient voluntad kann. Außerdem Yo ellos en PushParamsAndCall umbenannt.

declarar _params&[],_hGluDll&,_gluLookAtFuncAddr&
declarar eyeX!,eyeY!,eyeZ!,centerX!,centerY!,centerZ!,upX!,upY!,upZ!

def &stdcall 1 'Parámetro absteigend en el Stack, Función bereinigt el Stack
def &cdecl 2 'Parámetro absteigend en el Stack, Aufrufer muss el Stack incluso bereinigen
def &pascal 3 'Parámetro aufsteigend en el Stack, Función bereinigt el Stack

ASM "PushParamsAndCall",4
MOV ECX,Par1 'ECX=Count-Register para el Bucle con el Anzahl Parámetro en el Array invitar, se cada Loop en 1 verringert (Parámetro-Nummer en el Array, el Parámetro necesario, außer en Pascal-Calling-Convention, rückwärts en el Stack gepusht voluntad [FILO])
MOV EDX,Par2 'Offset des Array-Speichers en EDX invitar (es más rápido como el Zugriff encima el Parámetro, welcher auch ginge)
MOV EAX,Par4 '1=stdcall, 2=cdecl, 3=Pascal
CMP EAX,3
JZ PascalSchleife
Bucle:
MOV EAX,ECX 'aktuellen Schleifenzählerstand (=Nummer des aktuellen Paramters en el Array) en EAX invitar
DEC EAX 'EAX=ECX-1 (Speicher-Offset en el Array es nullbasiert); SUB EAX,1 ginge auch
ADD EAX,EAX 'EAX=EAX+EAX --> en el Endeffekt =EAX*2
ADD EAX,EAX 'EAX=EAX+EAX --> en el Endeffekt zusammen con el Línea davor =EAX*4 (el es el Offset para el Parámetro en el Array-Speicher)
ADD EAX,EDX 'Offset des Array-Speicherbereichs a EAX dazuaddieren
MOV EAX,[EAX] 'Parámetro a el Speicheradresse en EAX invitar
PUSH EAX 'Parámetro en el Stack pushen
LOOP Bucle 'ECX en 1 verringern y zurückspringen, a 0 erreicht es
JMP CallFunction
PascalSchleife:
MOV EAX,Par1
SUB EAX,ECX 'Parámetro en aufsteigender Reihenfolge en el Stack legen (Pascal-Calling-Convention)
ADD EAX,EAX 'EAX=EAX+EAX --> en el Endeffekt =EAX*2
ADD EAX,EAX 'EAX=EAX+EAX --> en el Endeffekt zusammen con el Línea davor =EAX*4 (el es el Offset para el Parámetro en el Array-Speicher)
ADD EAX,EDX 'Offset des Array-Speicherbereichs a EAX dazuaddieren
MOV EAX,[EAX] 'Parámetro a el Speicheradresse en EAX invitar
PUSH EAX 'Parámetro en el Stack pushen
LOOP PascalSchleife 'ECX en 1 verringern y zurückspringen, a 0 erreicht es
CallFunction:
CALL Par3 'Función aufrufen; de hier EAX no mehr anfassen, como en él el Rückgabewert es (oder EAX zwischenzeitlich sichern)
MOV EBX,Par4 'ahora prüfen, si cdecl, entonces muss el Stack manuell bereinigt voluntad
CMP EBX,2
JNZ Ende 'stdcall & Pascal: Stack wurde ya de el Función bereinigt
MOV EBX,Par1
ADD EBX,EBX
ADD EBX,EBX
ADD ESP,EBX 'Stack bereinigen (cdecl)
Ende:
'Volver-Valor es en EAX
ENDASM

cls
_hGluDll&=@usedll("glu32.dll")
_gluLookAtFuncAddr&=@external("kernel32.dll","GetProcAddress",_hGluDll&,"gluLookAt") 'Adresse el aufzurufenden Función ermitteln
_params&[1]=@long(@addr(eyeX!),0)
_params&[2]=@long(@addr(eyeX!),4)
_params&[3]=@long(@addr(eyeY!),0)
_params&[4]=@long(@addr(eyeY!),4)
_params&[5]=@long(@addr(eyeZ!),0)
_params&[6]=@long(@addr(eyeZ!),4)
_params&[7]=@long(@addr(centerX!),0)
_params&[8]=@long(@addr(centerX!),4)
_params&[9]=@long(@addr(centerY!),0)
_params&[10]=@long(@addr(centerY!),4)
_params&[11]=@long(@addr(centerZ!),0)
_params&[12]=@long(@addr(centerZ!),4)
_params&[13]=@long(@addr(upX!),0)
_params&[14]=@long(@addr(upX!),4)
_params&[15]=@long(@addr(upY!),0)
_params&[16]=@long(@addr(upY!),4)
_params&[17]=@long(@addr(upZ!),0)
_params&[18]=@long(@addr(upZ!),4)
imprimir PushParamsAndCall(18,@addr(_params&[1]),_gluLookAtFuncAddr&,&stdcall) '1. Parámetro: Anzahl Parámetro, 2. Parámetro: Adresse des Parámetro-Arrays, 3. Parámetro: Funktionsadresse, 4. Parámetro: Calling-Convention
waitinput
freedll _hGluDll&
end
 
XProfan X4 * Prf2Cpp * XPSE * JRPC3 * Win11 Pro 64bit * PC i7-7700K@4,2GHz, 32 GB RAM
PM: jreumsc@web.de
05.08.2023  
 




Jens-Arne
Reumschüssel
...y aquí el Ensamblador-Función para XProfan a X3 (also sin Inline-Ensamblador):

declarar _cPushParamsAndCall#,_a%,_b%
dim _cPushParamsAndCall#,75 'a XProfan 9: muss en long aligned ser, ggf. Ende con nullen auffüllen (hier es no aligned, se unten erledigt; antes XProfan 10 en 76 dimensionieren y una weiteres $00 anhängen)
'Opcodes en Zona escribir:
long _cPushParamsAndCall#,0=$5589E58B,$4D088B55,$0C8B4514,$83F80374,$1089C848,$01C001C0,$01D08B00,$50E2F2EB,$108B4508,$29C801C0,$01C001D0,$8B0050E2,$F0FF5510,$8B5D1483,$FB027509,$8B5D0801,$DB01DB01,$DC89EC5D
byte _cPushParamsAndCall#,72=$C2,$10,$00
'en long alignen (va sólo de XProfan 10, porque lo vorher kein "re"dim gab):
if ((@sizeof(_cPushParamsAndCall#)) mod 4)<>0
dim _cPushParamsAndCall#,@sizeof(_cPushParamsAndCall#)+(4-((@sizeof(_cPushParamsAndCall#)) mod 4))
endif
'Bytes en cada long umdrehen:
whileloop 0,@sizeof(_cPushParamsAndCall#)-4,4
_a%=@long(_cPushParamsAndCall#,&loop)
whileloop 0,3
byte @addr(_b%),&loop=@byte(@addr(_a%),3-&loop)
endwhile
long _cPushParamsAndCall#,&Loop=_b%
endwhile
'...
'... hier Parameterarray füllen etc.
'...
imprimir @call(_cPushParamsAndCall#,18,@addr(_params&[1]),_gluLookAtFuncAddr&,&stdcall) '1. Parámetro: Anzahl Parámetro, 2. Parámetro: Adresse des Parámetro-Arrays, 3. Parámetro: Funktionsadresse, 4. Parámetro: Calling-Convention
disponer _cPushParamsAndCall#
 
XProfan X4 * Prf2Cpp * XPSE * JRPC3 * Win11 Pro 64bit * PC i7-7700K@4,2GHz, 32 GB RAM
PM: jreumsc@web.de
07.10.2023  
 




Jens-Arne
Reumschüssel
Und, porque lo así schön es, todos otra vez para JRPC3 con FreeBasic, porque uno se así el sonst cada Aufruf de gluLookAt notwendige manuelle Setzen des Parámetro-Arrays con un Makro vom Hals schaffen kann y todos ebenfalls sin el XProfan-Inline-Ensamblador funktioniert (also para Versionen antes X4) - voll funktionsfähiges Ejemplo:

declarar _params&[],_hGluDll&,_gluLookAtFuncAddr&,_retval&
declarar eyeX!,eyeY!,eyeZ!,centerX!,centerY!,centerZ!,upX!,upY!,upZ!

def &stdcall 1 'Parámetro absteigend en el Stack, Función bereinigt el Stack
def &cdecl 2 'Parámetro absteigend en el Stack, Aufrufer muss el Stack incluso bereinigen
def &pascal 3 'Parámetro aufsteigend en el Stack, Función bereinigt el Stack

fbPROC PushParamsAndCall(byval AnzParams as long,byval pArray as long,byval pFunc as long,byval CallingConv as long) as integer export
dim as ulong ReturnValue
ASM
MOV ECX,[AnzParams] 'ECX=Count-Register para el Bucle con el Anzahl Parámetro en el Array invitar, se cada Loop en 1 verringert (Parámetro-Nummer en el Array, el Parámetro necesario, außer en Pascal-Calling-Convention, rückwärts en el Stack gepusht voluntad [FILO])
MOV EDX,[pArray] 'Offset des Array-Speichers en EDX invitar (es más rápido como el Zugriff encima el Parámetro, welcher auch ginge)
MOV EAX,[CallingConv] '1=stdcall, 2=cdecl, 3=Pascal
CMP EAX,3
JZ PascalSchleife
Bucle:
MOV EAX,ECX 'aktuellen Schleifenzählerstand (=Nummer des aktuellen Paramters en el Array) en EAX invitar
DEC EAX 'EAX=ECX-1 (Speicher-Offset en el Array es nullbasiert); SUB EAX,1 ginge auch
ADD EAX,EAX 'EAX=EAX+EAX --> en el Endeffekt =EAX*2
ADD EAX,EAX 'EAX=EAX+EAX --> en el Endeffekt zusammen con el Línea davor =EAX*4 (el es el Offset para el Parámetro en el Array-Speicher)
ADD EAX,EDX 'Offset des Array-Speicherbereichs a EAX dazuaddieren
MOV EAX,[EAX] 'Parámetro a el Speicheradresse en EAX invitar
PUSH EAX 'Parámetro en el Stack pushen
LOOP Bucle 'ECX en 1 verringern y zurückspringen, a 0 erreicht es
JMP CallFunction
PascalSchleife:
MOV EAX,[AnzParams]
SUB EAX,ECX 'Parámetro en aufsteigender Reihenfolge en el Stack legen (Pascal-Calling-Convention)
ADD EAX,EAX 'EAX=EAX+EAX --> en el Endeffekt =EAX*2
ADD EAX,EAX 'EAX=EAX+EAX --> en el Endeffekt zusammen con el Línea davor =EAX*4 (el es el Offset para el Parámetro en el Array-Speicher)
ADD EAX,EDX 'Offset des Array-Speicherbereichs a EAX dazuaddieren
MOV EAX,[EAX] 'Parámetro a el Speicheradresse en EAX invitar
PUSH EAX 'Parámetro en el Stack pushen
LOOP PascalSchleife 'ECX en 1 verringern y zurückspringen, a 0 erreicht es
CallFunction:
CALL [pFunc] 'Función aufrufen; de hier EAX no mehr anfassen, como en él el Rückgabewert es (oder EAX zwischenzeitlich sichern)
MOV EBX,[CallingConv] 'ahora prüfen, si cdecl, entonces muss el Stack manuell bereinigt voluntad
CMP EBX,2
JNZ Ende 'stdcall & Pascal: Stack wurde ya de el Función bereinigt
MOV EBX,[AnzParams]
ADD EBX,EBX
ADD EBX,EBX
ADD ESP,EBX 'Stack bereinigen (cdecl)
Ende:
MOV [ReturnValue],EAX 'Rückgabewert el aufgerufenen de EAX conjunto ("MOV [Function],EAX" funktioniert no, porque JRPC3 automáticamente una "volver 0" al Ende el fbPROC ergänzt, si kein volver-Valor angegeben es, una entsprechende Compilerwarnung a vermeiden)
FIN ASM
volver ReturnValue
ENDPROC 'PushParamsAndCall

MACRO mcrGluLookAt(#p1#,#p2#,#p3#,#p4#,#p5#,#p6#,#p7#,#p8#,#p9#)
_params&[1]=@long(@addr(#p1#),0)
_params&[2]=@long(@addr(#p1#),4)
_params&[3]=@long(@addr(#p2#),0)
_params&[4]=@long(@addr(#p2#),4)
_params&[5]=@long(@addr(#p3#),0)
_params&[6]=@long(@addr(#p3#),4)
_params&[7]=@long(@addr(#p4#),0)
_params&[8]=@long(@addr(#p4#),4)
_params&[9]=@long(@addr(#p5#),0)
_params&[10]=@long(@addr(#p5#),4)
_params&[11]=@long(@addr(#p6#),0)
_params&[12]=@long(@addr(#p6#),4)
_params&[13]=@long(@addr(#p7#),0)
_params&[14]=@long(@addr(#p7#),4)
_params&[15]=@long(@addr(#p8#),0)
_params&[16]=@long(@addr(#p8#),4)
_params&[17]=@long(@addr(#p9#),0)
_params&[18]=@long(@addr(#p9#),4)
_retval&=@PushParamsAndCall(18,@addr(_params&[1]),_gluLookAtFuncAddr&,&stdcall) '1. Parámetro: Anzahl Parámetro, 2. Parámetro: Adresse des Parámetro-Arrays, 3. Parámetro: Funktionsadresse, 4. Parámetro: Calling-Convention
ENDMACRO 'mcrGluLookAt

cls
_hGluDll&=@usedll("glu32.dll")
_gluLookAtFuncAddr&=@external("kernel32.dll","GetProcAddress",_hGluDll&,"gluLookAt") 'Adresse el aufzurufenden Función ermitteln
mcrGluLookAt(eyeX!,eyeY!,eyeZ!,centerX!,centerY!,centerZ!,upX!,upY!,upZ!)
imprimir _retval&
waitinput
freedll _hGluDll&
end
 
XProfan X4
XProfan X4 * Prf2Cpp * XPSE * JRPC3 * Win11 Pro 64bit * PC i7-7700K@4,2GHz, 32 GB RAM
PM: jreumsc@web.de
07.10.2023  
 



Respuesta


Título del Tema, max. 100 Signo.
 

Systemprofile:

Kein Systemprofil creado. [anlegen]

XProfan:

 Contribución  Font  Smilies  ▼ 

Bitte registro en una Contribución a verfassen.
 

Tema opciones

1.748 Views

Untitledvor 0 min.
Jens-Arne Reumschüssel06.01.2024
Thomas Freier06.01.2024
Alibre05.01.2024
Michael W.08.12.2023
Más...

Themeninformationen



Admins  |  AGB  |  Applications  |  Autores  |  Chat  |  Política de Privacidad  |  Descargar  |  Entrance  |  Ayuda  |  Merchantportal  |  Pie de imprenta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Juegos  |  Búsqueda  |  Support

Ein Projekt aller XProfan, el lo son!


Mi XProfan
Privado Noticias
Eigenes Ablageforum
Temas-Merkliste
Eigene Beiträge
Eigene Temas
Zwischenablage
Cancelar
 Deutsch English Français Español Italia
Traducciones

Política de Privacidad


Wir uso Cookies sólo como Session-Cookies wegen el technischen Notwendigkeit y en uns hay no Cookies de Drittanbietern.

Wenn du hier en unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung de Informationen en unseren Cookies en XProfan.Net a.

Weitere Informationen a unseren Cookies y dazu, como du el Kontrolle darüber behältst, findest du en unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Yo möchte no Cookie