Zur Nutzung von API

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Zur Nutzung von API

Beitrag von AND51 »

Hallo!

Ich habe ein Programm, das heißt "API-Guide". Es liest die verfügbaren API befehle auf meinem Rechner aus (derzeit ~925).

Nun möchte ich die Befehle ja auch selbst nutzen, ohne euch jedesmal fragen zu müssen.
Aber das Programm sagt nur, welche Parameter ein Befehl braucht, gibt auch eventuelle Konstanten an und so, aber da das Programm nicht PB-Optimiert ist, weiß ich nicht, wie ich die Befehele in PB verwenden kann.

Ich zeige es euch mal:

Ich suche und finde den Befehl "GetComputerName". Beschreibung lt. Programm:
The GetComputerName function retrieves the computer name of the current system. This name is established at system startup, when it is initialized from the registry.
So, dann gibt es noch verschiedene Registerkarten, auch reiter genannt. Das war grad die Registerkarte "Info". Register "Parameters" sagt mir dies:
Declaration:
Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long

Parameters:

· lpBuffer
Points to a buffer to receive the null-terminated character string containing the computer name.

· nSize
Points to a variable that specifies the maximum size, in characters, of the buffer. This value should be large enough to contain MAX_COMPUTERNAME_LENGTH + 1 characters.
Da fängts schon an. Das ist nicht für PB. Wie müsste ich das in PB umwandeln? Ich weiß nur, dass der Befehl in PB ein _ am Ende haben muss.

Die letzte Registerkarte ist "Example", sieht aber aus, wie Höhlenmalereien oder Hyroglyphen:

Code: Alles auswählen

'example by Donavon Kuhn (Donavon.Kuhn@Nextel.com)
Private Const MAX_COMPUTERNAME_LENGTH As Long = 31
Private Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long
Private Sub Form_Load()
    Dim dwLen As Long
    Dim strString As String
    'Create a buffer
    dwLen = MAX_COMPUTERNAME_LENGTH + 1
    strString = String(dwLen, "X")
    'Get the computer name
    GetComputerName strString, dwLen
    'get only the actual data
    strString = Left(strString, dwLen)
    'Show the computer name
    MsgBox strString
End Sub
Könnt ihr mir helfen, sodass ich rausfinden kann, wie ich solche Befehle selbst in PB-Form umwandeln kann? Danke!
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Macros
Beiträge: 1361
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Beitrag von Macros »

Hier ein Beispiel:

Code: Alles auswählen

buffer.s = Space(1024)
length.l=1024
GetComputerName_(@buffer, @length) 
debug buffer
Ein Pointer zeigt also z.B. auf eine Variable (mit @)
Diese muss vorher genügend Speicherplatz erhalten haben:
buffer.s = Space(1024)
"nsize" meint die maximale Größe der Rückgabe
also in diesem Fall die 1024 Stellen, die reserviert wurden.
Zuletzt geändert von Macros am 03.01.2006 21:05, insgesamt 1-mal geändert.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

OK, verstanden habe ich das, allerdings kommt bei deinem Code bei mir die Fehlermeldung "Invalid memory access".
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Code: Alles auswählen

#MAX_COMPUTERNAME_LENGTH = 31
Buffer.s = Space(#MAX_COMPUTERNAME_LENGTH+1)
size = #MAX_COMPUTERNAME_LENGTH
GetComputerName_(@Buffer, @size)
Debug Buffer
Debug size
Benutzeravatar
Macros
Beiträge: 1361
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Beitrag von Macros »

Ich hatte vergessen, die Länge in
eine Variable zu speichern und dann auch mit @ anzusteuern.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Aha! Dankeschön! Ich habe dies gleich an einem adneren beispie ausprobiert:

GetUserName:
Die Registerkarte sagt dazu:
API-Guide hat geschrieben:· lpBuffer
Points to the buffer to receive the null-terminated string containing the user’s logon name. If this buffer is not large enough to contain the entire user name, the function fails.

· nSize
Pointer to a DWORD that, on input, specifies the maximum size, in characters, of the buffer specified by the lpBuffer parameter. If this buffer is not large enough to contain the entire user name, the function fails. If the function succeeds, it will place the number of characters copied to the buffer into the DWORD that nSize points to.
lpBuffer ist also immer ein String, der mit @ angesteuert wird, nicht?
und nSize ist eine Zahlen-Variable, auch mit @?

Jedenfalls habe ich das so ausprobiert:

Code: Alles auswählen

buffer.s=Space(4096)
size=Len(buffer)
GetUserName_(@buffer, @size)
Debug buffer
und es funktioniert: André

kann ich dann nicht auch einfach 64000 als buffersize angeben, nach dem motto: Sicher ist sicher?! Denn 64 tsd. ist ja (noch) die Grenze von PB-Strings...Ansonsten nochmal DANKESCHÖN :allright:
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

lpBuffer ist also immer ein String, der mit @ angesteuert wird, nicht?
und nSize ist eine Zahlen-Variable, auch mit @?
Du uebergibst damit einen Pointer . Was du jedesmal uebergeben musst
steht auf MSDN oder halt auch in deinem Api Programm.
kann ich dann nicht auch einfach 64000 als buffersize angeben, nach dem motto: Sicher ist sicher?! Denn 64 tsd. ist ja (noch) die Grenze von PB-Strings...Ansonsten nochmal
Macht kein Sinn . #MAX_COMPUTERNAME_LENGTH = 31
Was laengeres wirst du da auch nicht rausbekommen.
Ich weiss es zwar nicht genau aber ich glaube das der Name
sogar nur auf 15 zeichen beschraenkt ist.
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 »

Hab zwar nicht alles gelesen, aber meist kann man den erforderlichen
Buffer ermitteln, wenn es da keine vordefinierte Konstante gibt:

Procedure.s GetUserName()
; benötigte Variablen protected, damit es mit evtl.
; globalen Variablen keine Konflikte gibt
Protected lpBuffer.s, nSize.l

; durch übergabe von 0 enthält GetLastError_() die erforderlich grösse
GetUserName_ (@lpBuffer, @nSize)

; nSize die grösse zuordnen
nSize = GetLastError_ ()

; Buffer einrichten, terminierte 0 wird von PB autom. angehangen
lpBuffer = Space (nSize)

; Funktion mit korrekten Werten aufrufen
GetUserName_ (@lpBuffer, @nSize)

; Funktionsergebnis zurückgeben
ProcedureReturn lpBuffer
EndProcedure

Debug GetUserName()
Ein paar If abfragen fehlen hier noch, ist also nicht Beispielhaft,
sondern soll das Prinzip verdeutlichen!
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
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Dake euch beiden.
@ TS-Soft, zuerst habe ich nicht verstanden, warum du zwei mal GetUserName() benutzt. Aber das tust du ja, damit GetLastError(), wie der Name schon sagt, die erforderliche Größe des Buffers bekommt.

OK, soweit habe ichs verstanden.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
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 »

Richtig, da 0 niemals reichen würde, gibts in jedem Fall einen Fehler, sollte
man aber mit If auf 0 testen, laut MSDN steht dann in GetLastError die
erforderliche grösse. So oder ähnlich geht es mit div. API-Funktionen, also in
der MSDN immer zuende lesen. API-Viewer oder API-Guide sind hier nicht
besonders hilfreich.
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
Antworten