apiviewer richtig verwenden?!

  • hallo

    Hab da mal ne frage :D

    wenn ich mit dem apiviewer eine Funktion z.b. waveoutgetdevs rausgesucht habe... wie bekomm ich dann eigendlich die dazugehörigen konstanten zu der Funktion bzw einem speziellen Rückgabewert?


    grez

    derda

  • Der ApiViewer beinhaltet keine Funktionsbeschreibungen sondern lediglich die Deklarationen.
    Ich persönlich nutze ihn deshalb nur für um die Werte der Konstanten zu bekommen.
    Kann aber auch sein das ich das Ding bisher immer falsch, bzw. ungenügend ausgenutzt habe ;)

    Jedenfalls wäre die erste Anlaufstelle für die Funktionsbeschreibungen die >>Windows-API-Referenz<<.
    Dort solltest du schon eher die Informationen finden die du suchst.

  • hi


    ich weiß nicht ob du mich richtig verstanden hast... ich will die Zahlen die ich von einer dll zurück bekomm auswerten...


    grez

  • Hab dich schon richtig verstanden.
    Aus der Deklaration einer Funktion wirst du nicht herauslesen welche Werte der Rückgabewert annehmen kann.
    Deswegen wird dir der API-Viewer nicht weiterhelfen.
    Dazu brauchst du eine weiterführende Referenz zu der Funktion - eine Anlaufstelle hab ich dir genannt.
    Hierzu ist aber zu sagen das ich keine Information über eine Funktion gefunden habe welche den von dir genannten Namen waveoutgetdevs trägt - höchstens waveOutGetNumDevs.
    Für die Multimedia-Funktionen findest du die entsprechende Referenz >>hier<< .
    Dort steht drin welche Bedeutung die Rückgabewerte haben - oftmals in Form von Konstanten, deren Werte du mit dem API-Viewer oder auf der msdn-Page herausbekommen kannst.

    Einmal editiert, zuletzt von AspirinJunkie (19. Dezember 2007 um 19:22)

  • hi

    sry... ich mien waveoutgetdevcaps das linkgedönz werd ich mir morgen mal anschaun....gn8


    grez

    derda

    edit: bin ich zu doof? ich finde die Bedeutung der Zahlen einfach nicht... hier mal der code um den es sich momentan dreht:

    Spoiler anzeigen
    [autoit]

    #cs ----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    AutoIt Version: 3.2.10.0
    Author: derda

    [/autoit] [autoit][/autoit] [autoit]

    Script Function:
    Waveoutfunktionen

    (c) bei derda (bitte es zu respektieren... hat ca 2 wochen arbeit gekostet)

    [/autoit] [autoit][/autoit] [autoit]

    #ce ----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    $struktur = _WAVEOUTCAPS()
    _waveOutGetDevCaps($struktur)

    [/autoit] [autoit][/autoit] [autoit]

    Func _WAVEOUTCAPS($dll="winmm.dll")

    [/autoit] [autoit][/autoit] [autoit]

    $stc = _
    "ushort wMid;" _
    & "ushort wPid;" _
    & "long vDriverVersion;" _
    & "char szPname[32];" _
    & "uint dwFormats;" _
    & "ushort wChannels;" _
    & "uint dwSupport"

    [/autoit] [autoit][/autoit] [autoit]

    $struct = DllStructCreate($stc)

    [/autoit] [autoit][/autoit] [autoit]

    MsgBox(0,"", _
    "Struct: " & $struct & @CRLF _
    & "@ERROR: " & @error)

    [/autoit] [autoit][/autoit] [autoit]

    Return $struct
    EndFunc
    Func _waveOutGetDevCaps($struct,$id=0,$dll="winmm.dll")
    SetError(0)

    [/autoit] [autoit][/autoit] [autoit]

    $ret = DllCall($dll, _
    "int","waveOutGetDevCapsA", _
    "uint",$id, _
    "ptr",DllStructGetPtr($struct), _
    "uint",DllStructGetSize($struct) _
    )

    [/autoit] [autoit][/autoit] [autoit]

    $out = "kein Array"
    If IsArray($ret) Then
    $out = "" & @CRLF
    For $i = 0 To UBound($ret) -1
    $out = $out & $i & ". Arrayelement: " & $ret[$i] & @CRLF
    Next
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    MsgBox(0,"", _
    "wMid: " & DllStructGetData($struct,"wMid")& @CRLF _
    & "wPid: " & DllStructGetData($struct,"wPid")& @CRLF _
    & "vDriverVersion: " & DllStructGetData($struct,"vDriverVersion")& @CRLF _
    & "szPname: " & DllStructGetData($struct,"szPname")& @CRLF _
    & "dwFormats: " & DllStructGetData($struct,"dwFormats")& @CRLF _
    & "wChannels: " & DllStructGetData($struct,"wChannels")& @CRLF _
    & "dwSupport: " & DllStructGetData($struct,"dwSupport")& @CRLF _
    & "@ERROR: " & @error & @CRLF _
    & "Rückgabewert der dll: " & $ret & @CRLF _
    & "Array der Rückgabewerte der dll:" & $out _
    )
    EndFunc

    [/autoit]

    grez

    edit:spoiler vergessen ^^

    2 Mal editiert, zuletzt von maycontainnuts (21. Dezember 2007 um 14:50)

  • Die Bedeutung welcher Zahlen ist dir jetzt noch unklar?
    Die Konstanten des Rückgabewertes der waveOutGetDevCaps-Funktion oder die Array-Elemente des Rückgabewertes der DLLCall-Funktion?

    Also gut - versuchen wir einfach beides zu klären.
    Der Rückgabewert der waveOutGetDevCaps-Funktion kann laut >>Funktionsbeschreibung<< nur die Werte MMSYSERR_NOERROR, MMSYSERR_BADDEVICEID, MMSYSERR_NODRIVER und MMSYSERR_NOMEM annehmen.
    Das entspricht quasi lediglich nur einer Information darüber ob die Funktion erfolgreich durchgeführt wurde oder nicht.
    Nach kurzem Blick in den API-Viewer erfahren wir das diese Konstantenwerte den Integerwerten 0, 2, 6 und 7 entsprechen.
    Um es vielleicht noch ein bisschen deutlicher zu machen hab ich deine Funktion mal bisschen angepasst:

    Spoiler anzeigen
    [autoit]

    Func _waveOutGetDevCaps($struct, $id = 0, $dll = "winmm.dll")
    Local Const $MMSYSERR_NOERROR = 0x0
    Local Const $MMSYSERR_BASE = 0x0
    Local Const $MMSYSERR_BADDEVICEID = $MMSYSERR_BASE + 2
    Local Const $MMSYSERR_NODRIVER = $MMSYSERR_BASE + 6
    Local Const $MMSYSERR_NOMEM = $MMSYSERR_BASE +7
    Local $ReturnValue = ''
    Local $ret, $out = "kein Array"

    $ret = DllCall($dll, _
    "int", "waveOutGetDevCapsA", _
    "uint", $id, _
    "ptr", DllStructGetPtr($struct), _
    "uint", DllStructGetSize($struct) _
    )
    $out = "kein Array"
    If IsArray($ret) Then
    $out = "" & @CRLF
    For $i = 0 To UBound($ret) - 1
    $out &=$i & ". Arrayelement: " & $ret[$i] & @CRLF
    Next
    EndIf

    If BitAND($ret[0], $MMSYSERR_NOERROR) = $MMSYSERR_NOERROR Then $ReturnValue &= 'MMSYSERR_NOERROR '
    If BitAND($ret[0], $MMSYSERR_BADDEVICEID) = $MMSYSERR_BADDEVICEID Then $ReturnValue &= 'MMSYSERR_BADDEVICEID '
    If BitAND($ret[0], $MMSYSERR_NODRIVER) = $MMSYSERR_NODRIVER Then $ReturnValue &= 'MMSYSERR_NODRIVER '
    If BitAND($ret[0], $MMSYSERR_NOMEM) = $MMSYSERR_NOMEM Then $ReturnValue &= 'MMSYSERR_NOMEM'

    [/autoit] [autoit][/autoit] [autoit]

    MsgBox(0, "", _
    "wMid: " & DllStructGetData($struct, "wMid") & @CRLF _
    & "wPid: " & DllStructGetData($struct, "wPid") & @CRLF _
    & "vDriverVersion: " & DllStructGetData($struct, "vDriverVersion") & @CRLF _
    & "szPname: " & DllStructGetData($struct, "szPname") & @CRLF _
    & "dwFormats: " & DllStructGetData($struct, "dwFormats") & @CRLF _
    & "wChannels: " & DllStructGetData($struct, "wChannels") & @CRLF _
    & "dwSupport: " & DllStructGetData($struct, "dwSupport") & @CRLF _
    & "@ERROR: " & @error & @CRLF _ ;Was soll das?
    & "Rückgabewert der dll: " & $ReturnValue & @CRLF _
    & "Array der Rückgabewerte der dll:" & $out _
    )
    EndFunc

    [/autoit]

    Nun zu den DLLCall-Rückgabewerten:
    DLLCall gibt ein Array zurück - im ersten Arrayelement steht der Rückgabewert der aufgerufenen DLL-Funktion in den darauf folgenden Elementen stehen die Werte die der DLLCall-Funktion als Parameter übergeben wurden.
    In deinem Fall hier also:

    Array[0] = Rückgabewert der waveOutGetDevCapsA-Funktion
    Array[1] = Wert der der Parameter uDeviceID beim Aufruf erhalten hat.
    Array[2] = Wert der der Parameter pwoc beim Aufruf erhalten hat.
    Array[3] = Wert der der Parameter cbwoc beim Aufruf erhalten hat.

  • hi

    jo dass weiß ich... was ich wissen wollte ist, was die Zahlen die in die struktur gefüllt wurden, beudeuten allso z.b. was 44 bei dwsupport beneuten etc... sorry wenn ich es zu ungenau erklärt habe...

    grez

  • Nun dwsupport gibt an welche Eigenschaften von diesem Soundinterface verwendet werden können.
    Im Prinzip entspricht die 44 lediglich der Summe der genutzten Konstantenwerte.
    Der Rückgabewert kann also mehrere Konstanten beinhalten welche man direkt abfragen muss.
    Das geht über BitAnd - hier liegt wohl eher das Verständnisproblem - falls ich heute Abend Zeit haben sollte werde ich das ganze vielleicht mal etwas genauer erklären.
    Ansonsten hab ich erstmal dein Beispiel so angepasst das du gleich sehen kannst welche Flags gesetzt wurden (genauso würde es auch beim dwFormats-Wert laufen):

    Spoiler anzeigen
    [autoit]

    Func _waveOutGetDevCaps($struct, $id = 0, $dll = "winmm.dll")
    Local Const $MMSYSERR_NOERROR = 0x0
    Local Const $MMSYSERR_BASE = 0x0
    Local Const $MMSYSERR_BADDEVICEID = $MMSYSERR_BASE + 2
    Local Const $MMSYSERR_NODRIVER = $MMSYSERR_BASE + 6
    Local Const $MMSYSERR_NOMEM = $MMSYSERR_BASE +7

    ;dwsupport-Konstanten:
    Local Const $WAVECAPS_LRVOLUME = 0x8
    Local Const $WAVECAPS_PITCH = 0x1
    Local Const $WAVECAPS_PLAYBACKRATE = 0x2
    Local Const $WAVECAPS_SYNC = 0x10
    Local Const $WAVECAPS_VOLUME = 0x4
    Local Const $WAVECAPS_SAMPLEACCURATE = 0x20
    ;--------------------

    Local $ReturnValue = '', $dwsupport = ''
    Local $ret, $out = "kein Array"

    $ret = DllCall($dll, _
    "int", "waveOutGetDevCapsA", _
    "uint", $id, _
    "ptr", DllStructGetPtr($struct), _
    "uint", DllStructGetSize($struct) _
    )
    $out = "kein Array"
    If IsArray($ret) Then
    $out = "" & @CRLF
    For $i = 0 To UBound($ret) - 1
    $out &=$i & ". Arrayelement: " & $ret[$i] & @CRLF
    Next
    EndIf

    If BitAND($ret[0], $MMSYSERR_NOERROR) = $MMSYSERR_NOERROR Then $ReturnValue &= 'MMSYSERR_NOERROR |'
    If BitAND($ret[0], $MMSYSERR_BADDEVICEID) = $MMSYSERR_BADDEVICEID Then $ReturnValue &= 'MMSYSERR_BADDEVICEID |'
    If BitAND($ret[0], $MMSYSERR_NODRIVER) = $MMSYSERR_NODRIVER Then $ReturnValue &= 'MMSYSERR_NODRIVER |'
    If BitAND($ret[0], $MMSYSERR_NOMEM) = $MMSYSERR_NOMEM Then $ReturnValue &= 'MMSYSERR_NOMEM'

    If BitAND(DllStructGetData($struct, "dwSupport"), $WAVECAPS_LRVOLUME) Then $dwsupport &= 'WAVECAPS_LRVOLUME |'
    If BitAND(DllStructGetData($struct, "dwSupport"), $WAVECAPS_PITCH) Then $dwsupport &= 'WAVECAPS_PITCH |'
    If BitAND(DllStructGetData($struct, "dwSupport"), $WAVECAPS_PLAYBACKRATE) Then $dwsupport &= 'WAVECAPS_PLAYBACKRATE |'
    If BitAND(DllStructGetData($struct, "dwSupport"), $WAVECAPS_SYNC) Then $dwsupport &= 'WAVECAPS_SYNC |'
    If BitAND(DllStructGetData($struct, "dwSupport"), $WAVECAPS_VOLUME) Then $dwsupport &= 'WAVECAPS_VOLUME |'
    If BitAND(DllStructGetData($struct, "dwSupport"), $WAVECAPS_SAMPLEACCURATE) Then $dwsupport &= 'WAVECAPS_SAMPLEACCURATE'

    MsgBox(0, "", _
    "wMid: " & DllStructGetData($struct, "wMid") & @CRLF _
    & "wPid: " & DllStructGetData($struct, "wPid") & @CRLF _
    & "vDriverVersion: " & DllStructGetData($struct, "vDriverVersion") & @CRLF _
    & "szPname: " & DllStructGetData($struct, "szPname") & @CRLF _
    & "dwFormats: " & DllStructGetData($struct, "dwFormats") & @CRLF _
    & "wChannels: " & DllStructGetData($struct, "wChannels") & @CRLF _
    & "dwSupport: " & $dwsupport & @CRLF _
    & "@ERROR: " & @error & @CRLF _ ;Was soll das?
    & "Rückgabewert der dll: " & $ReturnValue & @CRLF _
    & "Array der Rückgabewerte der dll:" & $out _
    )
    EndFunc

    [/autoit]
  • hi...

    das war mir klar... trotzdem danke :) und das mit den bitands wusste ich auch noch net ^^

    aber woher hast du die werte?


    grez

    Einmal editiert, zuletzt von maycontainnuts (23. Dezember 2007 um 20:23)

  • Du meinst die Werte der Konstanten wie z.b. $WAVECAPS_LRVOLUME?
    Na wie ich schon 100x schrieb mit dem API-Viewer... :huh:

    Also API-Viewer starten, Datenbank laden, in der oberen Combobox "Konstanten" auswählen und dann einfach im Suchfeld den Namen der Konstante eingeben - also im Beispielfall "WAVECAPS_LRVOLUME".
    Dann erscheint unten folgender Text: "Const WAVECAPS_LRVOLUME As Long = &H8" aus dem man herauslesen kann das der Wert der Konstanten 8 Hexadezimal beträgt.
    Oder hab ich jetzt wieder irgendwas von dir falsch interpretiert?

  • doch... schon richtig... aber woher weiß ich welche werte der Rückgabewert alles annehmen kann?

    grez...

  • Steht in der Funktionsbeschreibung:

    Zitat

    Return Values
    Returns MMSYSERR_NOERROR if successful or an error otherwise.
    Possible error values include the following:
    MMSYSERR_BADDEVICEID Specified device identifier is out of range.
    MMSYSERR_NODRIVER No device driver is present.
    MMSYSERR_NOMEM Unable to allocate or lock memory.

    Aber mal ehrlich - das hab ich doch schon alles geschrieben... :huh:

  • ja... das ist ja der rückgabewert der dll... aber die zahlen... also z.b. 44 bei dwsupport... wie weißt du das die ganzen dinger vorkommen können?

    Local Const $WAVECAPS_LRVOLUME = 0x8
    Local Const $WAVECAPS_PITCH = 0x1
    Local Const $WAVECAPS_PLAYBACKRATE = 0x2
    Local Const $WAVECAPS_SYNC = 0x10
    Local Const $WAVECAPS_VOLUME = 0x4
    Local Const $WAVECAPS_SAMPLEACCURATE = 0x20

    wie man die werte bekommt ist mir klar... aber woher weiß cih die gnazen namen? ^^
    *nichtschlagen**duck*

    grez...

  • Das steht alles in der Beschreibung der >>WAVEOUTCAPS-Struktur<< , welche in der Funktionsbeschreibung verlinkt ist.
    Diese müsstest du schon mindestens einmal gelesen haben da du sonst die Struktur nicht in deinem Skript hättest implementieren können da eben nur dort der Aufbau der Struktur beschrieben ist.

    und geschlagen wird hier sowieso nicht - wir machen so lange weiter bis es klappt - ob du willst oder nicht!  ;)

  • Wie versprochen nun noch die Erklärung zu den Flags und BitAnd.
    Dazu müssen wir einen kleinen Einblick in das binäre Zahlensystem wagen.
    Hier mal ein paar binäre Zahlen und ihre Entsprechung im Dezimalsystem:

    Code
    0000001 (1)
    0000010 (2)
    0000100 (4)
    0001000 (8 )
    0010000 (16)
    0100000 (32)
    1000000 (64)

    Was auffällt an diesen, nicht zufällig ausgewählten, Zahlen ist das jede dieser Zahlen genau einer Stelle in der Binärzahl entspricht.
    Wenn man diesen einzelnen Stellen nun jeweils eine eigene Bedeutung zuweist kann man nun in einer einzigen Zahl mehrere Informationen auf einmal unterbringen - das sind die "Flags".
    Beispiel: Die Funktion StringStripWS:
    In der Beschreibung zur Funktion findet sich eine Liste folgender Flags welche man als Parameter übergeben kann:

    Code
    1 (0001) = strip leading white space
    2 (0010) = strip trailing white space
    4 (0100) = strip double (or more) spaces between words
    8 (1000) = strip all spaces (over-rides all other flags)

    Diese kann man beliebig kombinieren in dem man einfach die Zahlen addiert.
    Wollen wir beispielsweise führende und doppelte Leerzeichen entfernen so geben wir als Flag-Parameter 1+4=5 an.
    Binär würde das so aussehen: 0001 + 0100 = 0101
    In der Funktion intern wird dann überprüft ob im Flag-Parameter die 1. Stelle den Wert 1 hat - nur dann werden führende Leerzeichen entfernt.
    Wenn überprüft wird ob doppelte Leerzeichen entfernt werden müssen so wird entsprechend die 3. Stelle der Zahl überprüft.
    Die jeweils anderen Stellen interessieren nicht - deswegen kann man die Flags so einfach kombinieren.

    Nun geht es darum "Wie wird ein Flag-Parameter auf einzelne Stellen hin untersucht?".
    Dazu schauen wir uns mal die mathematisch-logische Funktion der Konjunktion (=AND) an:
    Ein AND ist nur dann wahr wenn beide zu vergleichende Aussagen wahr sind.
    Ein "Wahr" entspricht in unserem Binärsystem einer 1 - ein "Falsch" der 0.
    Beim "BitAND" werden 2 Binärzahlen genommen und stellenweise per Konjunktion verglichen.
    Wohl am besten per Beispiel zu erklären:

    Code
    Zahl 1: 101101 (45)
    Zahl 2: 101011 (43)
        	------
    BitAND: 101001 (41)

    Im Ergebnis wird eine einzelne Stelle nur wahr (1) werden wenn in den beiden Ausgangszahlen diese Stelle ebenfalls 1 ist.
    Ist nur eine von beiden wahr (1) oder gar keine wird die Stelle im Ergebnis falsch (0).
    Hier im Beispiel wird die erste Stelle wahr (1) weil die Stelle in beiden Ausgangszahlen wahr (1) ist.
    In der 2. Stelle wird sie beispielsweise falsch (0) da nur die 2. Zahl an dieser Stelle wahr (1) ist.

    Diese Funktion können wir also nun nutzen um nur ganz genau eine einzige Zahlenstelle der Ausgangszahl auf wahr oder falsch zu überprüfen.
    Dazu brauchen wir nur die Ausgangszahl und eine Zahl welche an jeder Stelle 0 ist außer an der zu überprüfenden Stelle.
    Wenn das BitAND-Ergebnis 0 wird heißt das das diese Stelle in der Ausgangszahl ebenfalls 0 ist und in unserem Fall das Flag nicht gesetzt ist.
    Ist das BitAND-Ergebnis hingegen ungleich 0 so muss folglich die Ausgangszahl an dieser Stelle 1 sein damit wissen wir das das Flag dort gesetzt ist.
    Als Beispiel:
    Wir wollen beim StringStripWS-Flag überprüfen ob doppelte Leerzeichen entfernt werden sollen.
    Dazu müssen wir also die 3. Stelle überprüfen. - unsere Ausgangszahl muss also mit 0100 einem BitAND unterzogen werden:

    So ich hoffe ich konnte damit etwas klahrheit in die Thematik der Flags, und wie man mit ihnen umgeht, bringen.
    Und sorry für den Doppelpost - aber ich fand das das mit dem vorherigen Post thematisch zu wenig zu tun hatte... :whistling:

  • Das ist doch mal eine schöne Erklärung!Jetzt weiß ich endlich wozu BitAND da ist. :thumbup:8o:love: :thumbup:

    Projekte: Keine größeren (und fertigen)
    Gegen Internetzensur:
    https://epetitionen.bundestag.de/index.php?acti…s;petition=3860
    (Zeichnungsfrist abgelaufen)
    __________________________________________________________________________________________________________________________________
    Dieser Beitrag wurde bereits 264 mal editiert, zuletzt von »Fast2« (30. Februar 2009, 12:99)

  • hi

    das nen ich mal ein Beitrag :thumbup:

    ich hab jetzt mal die möglichen wmid werte und vdriverkonstanten
    rausgeschrieben(oder besser, von autoit raus schreiben lassen :D )

    jetzt noch versuchen, die Product identifiers zu "extraheiren", und dann wag ich mich mal an bitand :D

    grez

    Einmal editiert, zuletzt von maycontainnuts (25. Dezember 2007 um 20:20)