Seite 1 von 2

Umsetzung Aufruf externer DLL nach PB

Verfasst: 29.06.2007 17:04
von tomkn
Moin, moin

ich habe trotz Suchen und Lesen im Forum ein Problem mit der Umsetzung des Aufrufs einer Funktion in einer externen DLL.

Mit VB funktioniert es ohne Probleme, es liegt wohl an der Art wie ich aufrufe, es wird immer ein leerstring zurückgegeben.

Vielen Dank für Eure Hilfe
Tom

Code: Alles auswählen

 
;  VB
;  Public Declare Function QAPIGetLastErrorStringEx Lib "QLIB32" (ByVal buffer As String, ByVal buffersize As Long) As Long
;  Public Declare Function QAPIGetLastErrorCode Lib "QLIB32" () As Long
;  Public Declare Sub QAPIWatchdogEnable Lib "QLIB32" ()
;   
;  Dim buffer As String * 256
;  Dim result As Long
;  Call QAPIWatchdogEnable
;  If (QAPIGetLastError() <> 0) Then
;     result = QAPIGetLastErrorStringEx(buffer, 256)
;     MsgBox Left(buffer, result)
;  EndIf 
;  
 
#CRlf = Chr(13)+Chr(10)
Global dll.l
 
dll = OpenLibrary(#PB_Any,"c:\windows\system32\qlib32")
If dll = 0
 Return
EndIf

Procedure enable() 
 ProcedureReturn CallFunction(dll,"QAPIWatchdogEnable")
EndProcedure 
Procedure disable() 
 ProcedureReturn CallFunction(dll,"QAPIWatchdogDisable")
EndProcedure 
Procedure retrigger() 
 ProcedureReturn CallFunction(dll,"QAPIWatchdogRetrigger")
EndProcedure 
Procedure lasterr() 
 ProcedureReturn CallFunction(dll,"QAPIGetLastError")
EndProcedure 

Procedure maxcards()
 ProcedureReturn CallFunction(dll,"QAPIExtNumOfCards")
EndProcedure 

Procedure.s errorstring()
  buffer.s = Space(256)
  nLen.l   = 256
  ;nerg.l   = CallFunction(0,"QAPIGetLastErrorStringEx",@buffer, @nLen)
  nerg.l   = CallFunction(0,"QAPIGetLastErrorStringEx",buffer, nLen)
  ; nerg.l ist immer 0, Buffer immer space(256)
  ProcedureReturn Left(buffer, nerg)
 EndProcedure 

enable()
nLasterr.l  = lasterr()
;nMaxcards.l = maxcards()

If nLasterr <> 0
; ist 22 , genau wie in VB
 CallDebugger  
 cerr.s = errorstring()
 ; cerr.s ist immer leer
 MessageRequester( "ERR",cerr)
EndIf 

Verfasst: 01.07.2007 19:21
von PureBasic4.0
ProcedureReturn verlässt die prozedur. Wenn du nichts zurückgeben möchtest, lass es aus. Wenn nicht, dann setze es ans ende

Verfasst: 02.07.2007 10:44
von tomkn
Moin, moin

vielen Dank für die Antwort, leider habe ich sie nicht verstanden :-(

Ich möchte in der Procedure errorstring einen Wert zurückgeben.

Das Problem ist, das schon die Variablen nerg.l und buffer.s , die das Ergebnis des API Aufruf´s enthalten sollen, innerhalb der Procedure leer sind.
Es liegt also m.E. nach an der Umsetzung des API Aufrufs.

Danke für Eure Hilfe
Tom

Verfasst: 02.07.2007 14:13
von PureBasic4.0
Achso.... Das sah auf dem kleinen Handydisplay so komisch aus...

1. Ergebnis von CallFunction(...) in eine Variable schreiben (evtl. Variable Protected)
2. ProcedureReturn [VariablenName]

Verfasst: 02.07.2007 15:47
von HeX0R
Ignoriere am besten alles was PureBasic 4.0 bis jetzt gesagt hat, weils ziemlicher Blödsinn ist.

Hauptproblem ist bei dir (man beachte das fettgedruckte):

CallFunction(0,"QAPIGetLastErrorStringEx",buffer, nLen)

Verfasst: 02.07.2007 15:48
von a14xerus
Hexor hats erfasst.
Zusätzlich glaube ich das der obere von den beiden Befehlen der richtige ist ( der mit @buffer)... nLen wider rum würde ich ohne @ schreiben... aber das müsste in der Doc stehen. wichtig ist die 0, die falsch ist
Also ich kanns nich wissen, weil ich diese DLL nicht kenne, aber es ist meistens so das du die Speicheradresse übergibst und die Dll-Funktion schreibt dann was in eben diesen Speicher rein

Verfasst: 02.07.2007 16:17
von ts-soft
Vielleicht mal die PB4 Art und Weise nutzen, bringt eine Menge Vorteile:

Code: Alles auswählen

Prototype QAPIGetLastErrorStringEx(buffer.s, nLen.l = 255) 

Define.l DLL = OpenLibrary(#PB_Any, "QLIB32"); immer ohne Pfad!

If DLL
  QAPIGetLastErrorStringEx.QAPIGetLastErrorStringEx = GetFunction(DLL, "QAPIGetLastErrorStringEx")
  
  If Not QAPIGetLastErrorStringEx
    Debug "Function not found" : End
  EndIf
  
  Define.s buffer = Space(255)
  QAPIGetLastErrorStringEx(buffer)
  Debug buffer
EndIf
Natürlich aufgrund fehlender DLL nicht getested :mrgreen:

Verfasst: 02.07.2007 16:40
von PureBasic4.0
HeX0R hat geschrieben:Ignoriere am besten alles was PureBasic 4.0
Na, danke! :lol:

Verfasst: 02.07.2007 23:48
von edel
a14xerus hat geschrieben:Hexor hats erfasst.
Zusätzlich glaube ich das der obere von den beiden Befehlen der richtige ist ( der mit @buffer)... nLen wider rum würde ich ohne @ schreiben... aber das müsste in der Doc stehen.
Ob mit oder ohne @ , es wird in beiden Faellen der
Zeiger zum String uebergeben. Der 2. Parameter
erwarten keine Zeiger.

Verfasst: 03.07.2007 09:30
von tomkn
Moin, moin

erst mal herzlichen Dank an Euch alle.
Da habe ich die noch verbliebene 0 vor lauter Variablen nicht gesehen.

So funktioniert es :

Code: Alles auswählen

 nerg.l   = CallFunction(dll,"QAPIGetLastErrorStringEx",buffer, nLen)
Auch mit @buffer klappt es.

An die 4.0 Art werde ich mich jetzt mal langsam annähern. Ich sehe zwar noch keinen Vorteil, aber schaun mer mal.

Grüße aus Hamburg
Tom