Seite 1 von 1

Unbekannte Funktion ?

Verfasst: 28.12.2013 17:04
von Oskar
Hallo,
ich bin was PureBasic angeht noch Anfänger. Ich habe mir PB gekauft, weil ich
gerne in die Programmierung einsteigen möchte. Ich selbst habe in der Batch-
Programmierung seit WIN95 bis WIN7 schon einiges gemacht. Aber Batch ist natürlich
nicht unbedingt der Hit, vor allem wenn es um übersichtlichkeit des Codes geht.

Nach dem ich das PB-PDF zum grossen Teil durchgearbeitet habe, bin ich angefangen
mir einige kleine Progs aus dem Netz runter zuladen.Dies habe dann mittels des
eingebauten Debuggers Schritt für Schritt durchgelaufen um nach zu vollziehen
was da genau passiert. Im grossen und ganzen verstehe ich auch alles, aber auf
eine Sache bin des öfteren gestossen wo ich nicht richtig weiterkomme und in der
Dokumentation nichts finde, oder nur ganz ansatzweise 1 zeilige Erklärungen sind
die mir nicht weiterhelfen.

Hier ein Beispiel Code der auch funktioniert.
Dieses PRG liest nur den aktuellen User Namen aus.
Ich weiss es geht auch einfacher aber darum geht es nicht !

Code: Alles auswählen

Declare.s GetUserName()

MessageRequester("", "Benutzer-Name: " + GetUserName(), 0)

Procedure.s GetUserName()
  Protected User.s = "", Size.l = 0
  If Not GetUserName_(@User, @Size) 
    User = Space(Size)
      If GetUserName_(@User, @Size)
        MessageRequester("", "Nach GetUserName: " + User, 0)
        ProcedureReturn User
      EndIf
   EndIf
EndProcedure
1.Es geht um den Funktionaufruf "GetUserName_(@User, @Size)" wofür steht der "_" Strich ?
Irgentwo in dem PB Handbuch meine ich eine Erklärung mal gesehen zu haben.

2.Die Kernfrage wo steht diese Funktion erklärt, ich finde garnichts. Ich weiss das diese
Funktion z.b in der "advapi32.dll" enhalten ist. Aber nach meinem Verständniss bis jetzt
muss ich doch mit dem Befehl "DLL = OpenLibrary(#PB_Any, "advapi32.dll")" die entsprechende
DLL erst öffnen um an diese Funktion zu kommen. Das obige Beispiel geht aber ohne OpenLib.
Frage wo kommt diese Funktion her ? Wo finde ich eventuell noch weitere wovon ich nichts weiss ?
In der Doku finde ich jedenfalls nichts, zumindest wenn ich nicht vor Blindheit erschlagen werde.

3.Die Variablen "User + Size" scheint es ja in der Funktion auch zu geben ?
Woher kann ich das wissen oder wie bekomme ich das heraus.

4.Wenn mir mein Gefühl nicht täuscht oder ich vor lauter ausprobieren etwas übersehen habe scheint
doch die Dokumentation noch etwas lückenhaft zu sein. :roll:

Ja, ich würde mich wirlich sehr freuen wenn ich zu meinen Fragen einige nach vollziehbare Sätze
der Erklärungen bekommen könnte.

__________________________________________________
Code-Tags hinzugefügt
28.12.2013
RSBasic

Re: Unbekannte Funktion ?

Verfasst: 28.12.2013 17:18
von ts-soft
Die meisten, vor allem die älteren API-Funktionen, welche in allen Windows-Versionen vorkommen, die PB unterstützt,
werden vom Compiler direkt importiert. Alle diese API-Funktionen haben denselben Namen, wie in der MSDN dokumentiert,
abgesehen von W oder A am ende (steht für Ansi oder UnicodeVersion der Funktion), + einem Unterstrich aufgerufen.
Welche das im einzelnen sind, ist nirgends aufgelistet, das würde ja Bücher füllen. API-Funktionen der verschiedenen
unterstützten Betriebssysteme sind grundsätzlich nicht dokumentiert, weil dies viel zu aufwendig wäre. Entsprechende
Hinweise findet man im Internet in der MSDN oder hier in den Foren.

Einfach API-Funktion mit Unterstrich ausprobieren, entweder er meldet, unbekannte Funktion oder es funktioniert,
vorausgesetzt die richtigen Parameter werden übergeben. Alle anderen API-Funktionen kann man dann über die ent-
sprechende DLL laden, bzw. aus der entsprechenden Lib importieren.

Gruß
Thomas

Re: Unbekannte Funktion ?

Verfasst: 28.12.2013 17:20
von RSBasic
Funktionsnamen mit "_" am Ende bedeutet, dass es eine vom Betriebssystem bereitgestellte Funktion ist. Also beispielsweise unter Windows ist WinAPI.
Wenn du z.B. WinAPI-Funktionen/-Strukturen/-Konstanten nutzt, dann funktioniert deine Anwendung nur unter Windows.
Beschreibungen der einzelnen WINAPI-Funktionen findest du nicht in der PB-Hilfe, sondern auf der Microsoft-Seite unter MSDN. Z.B.:
GetUserName: http://msdn.microsoft.com/en-us/library ... 85%29.aspx
PureBasic bietet unter Windows zusätzlich WinAPI-Unterstützung an. Viele WinAPI-Funktionen, -Konstanten u.ä. werden unterstützt und diese wurden bereits für dich deklariert.
Du brauchst diese nicht manuell einbinden und deklarieren. Es kann aber vorkommen, dass du bestimmte Funktionen, die z.B. erst ab Vista gibt, manuell einbinden musst.

Re: Unbekannte Funktion ?

Verfasst: 28.12.2013 17:22
von Derren
Der "_" Strich steht für API-Funktionen. PB bietet nahezu vollständigen Zugriff auf alle API Funktionen des Betriebssystems ohne dass man jede einzelne Funktion extra importieren müsste.

1. GetUserName() ist eine Funktion der Windows-API. Der Unterstrich wird benutzt um API-Funktionen von PB-internen Funktionen abzugrenzen.
Wenn du also irgendwo im Netz auf einen Beitrag stößt, in dem steht "Die Windows API-Funktion GetUserName() wird verwendet um den aktuellen Benutzernamen auszulesen", dann musst du einfach nur einen Unterstrich einfügen.

2. Ganz richtig, wie ich bereits sagte, importiert die meisten nötigen Libaries (DLL's) automatisch. OpenLibrary() benötigst du also nur, bei Funktionen, die nicht direkt von PB importiert werden.
Zur Hilfe: Irgendwo gibt es eine *.hlp Datei, in der die meisten API-Funktionen erklärt sind. Diese Hilfe ist auch kontextaktiviert. D.h. wenn du dieses Help-File in den Help Ordner von PB steckst, kannst du einfach den Cursor auf GetUserName_() setzen und F1 drücken.
Ich glaube aber dass dieses Help-File nicht mehr ganz aktuell ist. Hab es lang nicht mehr benutzt.
Denn es gibt noch eine andere und bessere Hilfe: Die MSDN (Microsoft Developer Network). Es gibt ein paar Tools, die MSDN auch in PB einbinden sollen (damit F1 funktioniert), ich kann dir aber gerade keine Namen oder Links nennen.
Du kannst einfach "MSDN GetUserName()" bei Google eintippen (Funktionsnamen ohne Unterstrich, das ist ja nur eine Eigenart von PB).

3. Also, welche Parameter die Funktion erwartet sagt dir die Hilfe/MSDN, siehe oben.
Dabei ist es aber völlig egal wie die Parameter genannt werden.
Der Funktionsaufruf könnte genauso gut "GetUserName_(@Benutzer, @Groesse)" heißen. Du kannst deine eigenen Variablen nennen wie du willst und bist nicht darauf angewiesen, wie der Programmierer der Funktion seine Variablen genannt hat.

4. Die Dokumentation is nicht lückenhaft. Du betrittst hier nur API-Terrain, und dafür sind die Macher von PB nicht zuständig, sondern die Macher des jeweiligen Betriebssystems. Entweder in dem PDF wurde das nicht erwähnt, oder du hast mit dem Begriff nichts anfangen können. Wie dem auf sei. Funktionen mit "_" sind Funktionen des Betriebssystems, die auf anderen System evtl. gar nicht existieren oder anders aufgebaut sind.

Re: Unbekannte Funktion ?

Verfasst: 29.12.2013 11:50
von Oskar
Hallo,

ich wollte mich noch mal für die Antworten bedanken.
War sehr schnell und für mich von nutzen.
Jetzt komme ich auch weiter.

Ich wünsche allen Forum's Mitgliedern noch einen
Guten Rutsch ins neue Jahr