DLLFunction(..) USING ? Ja was denn...

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

DLLFunction(..) USING ? Ja was denn...

Beitrag von brandelh »

Hallo,

In der Doku stehen 3 mögliche Win32 Werte für USING:

DllFunctin() USING ...
STDCALL Standard für Windows 32bit API
CDECL C-Aufrufkonvention
OSAPI Aufruf für Betriebsystem API
oder nix für XPP...

Wenn ich jetzt eine fremde DLL habe, woher weiß ich dann was ich nehmen soll ?
RMCHART.DLL z.B. hat optionale Parameter, kann es dann über STDCALL aufgerufen werden oder muß es CDECL sein ?
Gruß
Hubert
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16508
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Hubert,
wenn Du in der entsprechenden Doku nichts findest, hilft nur ausprobieren :D
Im Falle von RMChart kannst Du ja schon mal davon ausgehen, dass Du einen Paramter angeben musst (da nicht in Xbase++ programmiert).
Also bleibt Dir die (sinnvolle) Wahl zwischen CDECL und STDCALL, von der ich erstgenannte mal zuerst versuchen würde...
Hast Du mal in dem langen Thread geschaut, ob da nicht was zu steht?

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Martin,

da ist ein Beispiel für Active X. Ich übersetze gerade die Dateien für den DLL Zugriff.
Gruß
Hubert
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9356
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Beitrag von Tom »

Hallo, Hubert.

Ich nutze einige Fremd-DLLs, durchgehend per STDCALL. Vermutlich läßt sich das am einfachsten durch ausprobieren herausfinden.
Herzlich,
Tom
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Parameter Typen

Beitrag von brandelh »

Hallo,

wenn ich mir die Parametererklärung von DllCall ansehe, scheinen bei der Übergabe alle numerischen Werte in LONG oder UnsignedLONG (DWORD) umgewandelt zu werden, wenn ich also double (8 Byte Fließkomma) brauche muß ich über F2BIN() oder ?
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hi,

in der PowerBasic Hilfe steht, dass STDCALL die von Microsoft definierte Standardaufrufroutine ist. RMChart-PowerBasic Beispiele nutzen STDCALL.
Gruß
Hubert
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16508
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Parameter Typen

Beitrag von Martin Altmann »

Hallo Hubert,
brandelh hat geschrieben:wenn ich mir die Parametererklärung von DllCall ansehe, scheinen bei der Übergabe alle numerischen Werte in LONG oder UnsignedLONG (DWORD) umgewandelt zu werden, wenn ich also double (8 Byte Fließkomma) brauche muß ich über F2BIN() oder ?
Günter Beyes hat dazu in der Alaska-Generic-Newsgroup vor einigen Wochen etwas gepostet:
Günter Beyes hat geschrieben:FUNCTION AdsSetRelKeyPos( hIndex, nRelKeyPos )

STATIC tpl

LOCAL cDouble := F2Bin( nRelKeyPos )
LOCAL nLower := Bin2L( Left( cDouble, 4 ) )
LOCAL nUpper := Bin2L( Right( cDouble, 4 ) )

IF tpl == NIL
tpl := DllPrepareCall( "ace32.dll", ;
DLL_STDCALL, "AdsSetRelKeyPos" )
ENDIF

RETURN DllExecuteCall( tpl, hIndex, nLower, nUpper )
Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Martin,

danke für den Hinweis, ich habe mit der Suchfunktion das ganze Alaska Forum nach DOUBLE und PARAMETER abgesucht, aber leider vor lauter Treffer den richtigen nicht gefunden :?

Schon blöd, dass man die Werte drehen muß.
Für was ist dann F2BIN überhaupt zu gebrauchen, wenn man die Werte doch wandeln muß.

Weißt du ob bei diesem Beispiel:

nLower := Bin2L( Left( cDouble, 4 ) )

der Parameter nLower und die Verwendung von
Bin2L( Left( cDouble, 4 ) )
bei der Parameterübergabe identisch sind ?

Es wird Zeit, dass wir in Xbase endlich gescheite Datentypen bekommen.
Nun kann ich zig Zeilen abändern. :evil:
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hier noch kurz zur Ergänzung der Umkehrschritt:

Code: Alles auswählen

nDouble -> Parameter 1. nLow, 2. nHigh

nDouble := 123456789.123456789                  // nDouble -> nLow,nHigh Parameter
cDouble := f2Bin(nDouble)
nLow    := Bin2L( Left( cDouble, 4 ) )          // 1. Parameter
nHigh   := Bin2L( right( cDouble, 4 ) )         // 2. Parameter

function(..., @nLow,@nHigh, ....  // 2 Parameter statt einem nDouble !

Rückgabewert Parameter 1. nLow, 2. nHigh -> nDouble 
(nur falls Übergabe per Referenz = @...)

nDouble := bin2F(l2bin(nLow)+l2bin(nHigh))  // -> nDouble
Beispiel:

Code: Alles auswählen

proc main
local nLow, nHigh, nDouble, cDouble

nDouble := 123456789.123456789    // nDouble -> nLow,nHigh Parameter
cDouble := f2Bin(nDouble)
nLow    := Bin2L( Left( cDouble, 4 ) )          // 1. Parameter
nHigh   := Bin2L( right( cDouble, 4 ) )         // 2. Parameter

? "nDouble       ",nDouble
? "cDouble       ",cDouble
? "bin2F(cDouble)",bin2F(cDouble)
? "bin2F(cLO+cHI)",bin2F(l2bin(nLow)+l2bin(nHigh))  // -> nDouble
return
Ausgabe:

Code: Alles auswählen

nDouble         123456789,123456800
cDouble        uk~T4oØA
bin2F(cDouble)  123456789,12345680
bin2F(cLO+cHI)  123456789,12345680
Gruß
Hubert
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16508
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Hubert,
brandelh hat geschrieben:Weißt du ob bei diesem Beispiel:
sorry - aber da muss ich passen! So tief bin ich in die Abgründe von Windows noch nicht eingedrungen! :lol:
Aber Günter hat Dir ja gerade in der Newsgroup geantwortet...

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo,

Genau Günter hat mir eben mitgeteilt, dass der ganze Schmonz nicht nötig ist, wenn ein Parameter per Referenz übergeben werden soll ...

Also die Variable nDouble vom Typ Double wird so per Referenz übergeben:

cDouble := F2BIN(nDouble)
dllfunction xyz( @cDouble )

und dann ist der Rückgabewert ja ganz einfach zurückzuwandeln:

nDouble := BIN2F(cDouble)
Gruß
Hubert
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16508
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Hubert,
sage mir doch bitte Bescheid, wenn Du mit der RMChart-Integration soweit fertig bist - ich könnte das sehr gut für einen Webserver gebrauchen, den ich gerade entwickle :!:
Ich möchte da nämlich Balken- und Kreisdiagramme anhand der Meldungen erzeugen und als GIF speichern können.
Mit ActiveX möchte ich mir für dieses "kleine" Projekt nicht extra noch unnötig overhead aufladen und ein kommerzielles Produkt rechnet sich nicht, da ich diesen Webserver sozusagen "ehrenamtlich" (also ohne dafür was zu bekommen) entwickle.
Aber trotzdem schwebt mir halt vor, das ganze ein wenig "aufzuhübschen", so dass sich jeder, der dort melden will, anzeigen lassen kann, wie andere sich bei einzelnen Dingen entschieden haben.
Ich habe mir gerade mal von James Loughner die BARCHART.ZIP heruntergeladen und werde sie mir heute nachmittag mal anschauen, aber da ist - glaube ich - kein Kreisdiagramm bei...

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Antworten