Allgemeine Fragen zur PROFAN Programmierung
Views (Heute): 240913 (2349)
  Suchen
 Zurück zur Übersicht
 AutorThema: Call32 DLL
M.Heinemann
Datum:26.08.02 16:55 Antwortenals Email verschicken (info@heinemaennchen.de) 


Hallo Profaner,

da mir mit meinem 16 - 32 Bit Problem anscheinend keiner so richtig helfen kann,
wollte ich mal fragen, wer denn diese DLL alles schon mal so ausprobiert hat.

Vielleicht könntet ihr mir mal einen Beispiel Quellcode schicken, wie man das Ding
einsetzt, das Roland sein Beispiel bei mir auch nicht funktioniert.

Wäre echt super von euch.

Vielen Dank.

Gruß M.Heinemann


M.Heinemann
Datum:26.08.02 18:35 Antwortenals Email verschicken (info@heinemaennchen.de) 


Es scheint wohl so, das man mit der DLL zwar 32-Bit Api Funktionen aufrufen kann, aber keine Funktionen einer 32-Bit DLL.
Kann das irgendwer bestätigen ???

Wie ist das eigentlich mit dem Befehl "RUNDLL32"

DLL und DLL-Funktion aufrufen kein Probelm, aber wie kann man da denn noch einen Parameter übergeben ???

Na ja, wäre schön, wenn mir irgendwer helfen könnte.

Bis dann

M.Heinemann



Thorsten
Datum:26.08.02 18:55 Antwortenals Email verschicken (mrk@mrk-soft.de) 


Hallo,

erst mal, so ganz versteh ich den Sin nicht, aus einer 16
Bit Umgebung eine 32 Bit DLL aufzurufen.

Ein 16 Bit Prog eigentlich nur für Win 3.11 nötig, ew. noch,
wenn es als Externes Programm eines anderen 16 Bit Programm
über eine DLL benutzt wird, aber dann wäre die DLL auch eine
16 Bit DLL.

Also Win 3.11, nur, darunter funktionieren eh keine 32 BIT
DLLs, also irgendww Sinlos. !!!

Umgekert, aus einer 32 Bit Umgebung eine 16 Bit DLL
aufzurufen, macht da schon mehr Sinn, weil es z.b noch keine
32 Bit DLL Version gibt. Allerdings ist die Kommunikation
dieser schnittstelle ehlend lagsamm, daher eigentlich nicht
zu empfehlen.

Daher.
a) Warum läst sich das Programm selber nicht in 32 BIT Profan schreiben.
b) die DLL ist eine 32 BIT DLL ???, ja, wo liegt das Problem.

Thorsten




M.Heinemann
Datum:26.08.02 19:19 Antwortenals Email verschicken (info@heinemaennchen.de) 


Das Problem ist folgendes.
Ich weiß man mag es kaum glauben, aber wenn ich eine LPT-Ausgabe für eine Schrittmotorsteuerung in einem 32-Bit Programm schreibe, dann läuft die Ausgabe an den eigentlichen Motor äußertst unstabil. Das gleiche Programm in einer 16-Bit Version entwickelt, läuft super. Muß irgendwas mit dem Zeitverhalten zu tun haben. Hab ich aber auch schon mit rumgespielt, aber das bringt einfach alles nichts.
32-Bit sind für diesen Vorgang einfach nicht geeignet.

Da aber unter Windows NT,2000,XP keine direkten LPT-Port ausgaben mehr möglich sind, habe ich also mein Ansteuerungsprogramm in 16-Bit und die Port Ausgabe in einer 32-Bit DLL.

Ich hoffe das wahr jetzt nicht zu kompliziert.
Wenn irgendwer eine Idee hat, wie ich es einfacher machen könnte, bin ich für jeden Vorschlag offen, da mir die Lösung auch nicht so richtig gefällt.

Na ja, ich probiers irgendwie weiter, und helft mir bitte, falls ihr eine Idee habt.

Danke.

Euer M.Heinemann


Roland G. Hülsmann
Datum:27.08.02 09:23 Antwortenals Email verschicken (rgh-soft@t-online.de) 


Hallo,

wie gesagt: Bei uns in der Firma läuft die Call32.dll sehr stabil und nicht nur mit der Windows-API, sondern ganz besonders mit von mir selbst geschriebenen DELPHI-DLLs.

Hierbei ist ganz wichtig: Du mußt auf die Aufruf-Regeln (Calling Conventions) achten! Voreingestellt ist bei Delphi eine Delphieigene Lösung. Derartige DLLs können nur von Delphi aus aufgerufen werden. Im 32-Bit-Windows ist die Calling Convention STDCALL Standard. Nur diese wird von der Call32.dll verstanden. (Auch Visual Basic und PROFAN kennen nur diese unter 32 Bit.) Du mußt also ein STDCALL hinter die Funktionsdeklaration schreiben. Beispiel:
function SQLInit(Init:pchar):Integer; Export; stdcall;

Bei Strings ist es wichtig, daß aud Delphiseite PChar vewrwendet werden und auf PROFAN-Seite Bereiche. Dann sollte es klappen. Ach ja: Der Rückgabewert der externen Funktion muß 32 Bit sein, also ein Integer bzw. LongInt (was unter Delphi dasselbe ist). In PROFAN sollte er einem LongInt zugewiesen werden.
Ich hoffe, das holft Dir etwas weiter!

Gruß
Roland

Hintergrund: Die Calling-Conventions regeln zum einen, in welcher Reihgenfolge die übergebenen Parameter auf den Parameterstack sind und abgearbeiter werden und zum anderen ob die aufgerufene Funktion oder das aufrufende Programm den Parameterstack nach der Funktion aufräumen muß. Bei der Delphi-eigenen Regel werden zudem einige Parameter über die Prozessor-Register übergeben, was das Ganze zwar inkompatibel aber dafür etwas schneller macht (ist also nur ratsam wenn eine DLL ausschließlich vom dazugehörigen Delphiprogramm aufgerufen wird).



M. Heinemann
Datum: 28.08.02 16:40 Antwortenals Email verschicken (info@heinemaennchen.de) 


Ich zeige hier mal den Quellcode zum Aufruf der DLL Funktion:

' ==========================================================
' Programm: 16-Bit Programm ruft 32-Bit DLL Funktion auf
' ==========================================================

' =======================
' Definitionen festlegen
' =======================

Def Declare32(3) * "call32.dll","Declare32","&&&","&"
Def FreeCall32IDs(0) * "call32.dll","FreeCall32IDs","","&"

Def PortOut(2) * "call32.dll","Call32","&&",""

' =======================
' Declarationen festlegen
' =======================

Declare idPortOut&

Declare FName#
Declare FDLL#
Declare FPar#
Declare Byte%
Dim FName#,13
Dim FDLL#,6
Dim FPar#,4

' =======================
' Dll Funktion angeben
' =======================

String FName#,0 = "PortOut"
String FDLL#,0 = "io.dll"
String FPar#,0 = ""
Let idPortOut& = Declare32(FName#,FDLL#,FPar#) 'Programm stürzt komischerweise hier immer ab

' =============
' Proceduren
' =============

Proc Load
Declare ende%, i%, r&, hpen&
WindowTitle "PROFAN 16 ruft 32-Bit-API!"
Window 1,1 - 500,500

let byte% = 255
let r& = PortOut($378, byte%)

EndProc

Proc Unload
Declare r&
' WICHTIG: Der folgende Aufruf sorgt dafür, daß die von CALL32.DLL geladenen
' DLLS wieder entladen werden!
FreeCall32IDs()
EndProc

' ================
' Hauptprogramm
' ================

Load
Unload

End

Vielleicht ist es so einfacher rauszubekommen warum das Proggy abstürzt.

Vielen Dank Roland.

Mfg M.Heinemann

PS: DLL ist downloadbar unter http://www.heinemaennchen.de/download/index.htm


 Zurück zur Übersicht