Umsetzung Aufruf externer DLL nach PB

Anfängerfragen zum Programmieren mit PureBasic.
tomkn
Beiträge: 4
Registriert: 29.06.2007 16:44

Umsetzung Aufruf externer DLL nach PB

Beitrag 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 
Benutzeravatar
PureBasic4.0
Beiträge: 785
Registriert: 29.10.2006 17:26
Wohnort: 127.0.0.1

Beitrag 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
PB 4.50 RC1 + Ubuntu 10.04 LTS + Windows 7 x64
tomkn
Beiträge: 4
Registriert: 29.06.2007 16:44

Beitrag 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
Benutzeravatar
PureBasic4.0
Beiträge: 785
Registriert: 29.10.2006 17:26
Wohnort: 127.0.0.1

Beitrag 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]
PB 4.50 RC1 + Ubuntu 10.04 LTS + Windows 7 x64
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag 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)
a14xerus
Beiträge: 1440
Registriert: 14.12.2005 15:51
Wohnort: Aachen

Beitrag 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
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
PureBasic4.0
Beiträge: 785
Registriert: 29.10.2006 17:26
Wohnort: 127.0.0.1

Beitrag von PureBasic4.0 »

HeX0R hat geschrieben:Ignoriere am besten alles was PureBasic 4.0
Na, danke! :lol:
PB 4.50 RC1 + Ubuntu 10.04 LTS + Windows 7 x64
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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.
tomkn
Beiträge: 4
Registriert: 29.06.2007 16:44

Beitrag 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
Antworten