PB versteht bestimmte API-befehle nicht !?!

Anfängerfragen zum Programmieren mit PureBasic.
Dr.Pixel
Beiträge: 90
Registriert: 12.08.2005 12:38

PB versteht bestimmte API-befehle nicht !?!

Beitrag von Dr.Pixel »

Warum versteht PureBasic bestimmte Befehle nicht?
Beispiel:

Code: Alles auswählen

hWnd.l = FindWindow_(0, "Dokument1 - Microsoft Word") 
If hWnd 
  SetForegroundWindow(hWnd)
EndIf

Fehlermeldung:
Zeile3: SetForegroundWindow() is not a function, an array, or a linked list

Auch bei vielen anderen Befehlen aus dem Codearchiv kommt diese Fehlermeldung.
Muss ich mit "IncludeFile" noch eine api.dll oder ähnliches hinzufügen?

Danke.

Edit by Kiffi: Code-Tags gesetzt
Benutzeravatar
Tafkadasom2k5
Beiträge: 1578
Registriert: 13.08.2005 14:31
Kontaktdaten:

Beitrag von Tafkadasom2k5 »

Das Problem kenne ich auch...bei den Befehlen wos ned ging hab ich das dann so gemacht:


LoadLibrary(1,blabla.dll..)
CallFunction(1,"Befehl",flags)

die "1" steht hier immer für die ID der geladenen Library...
OpenNetworkConnection() hat geschrieben:Versucht eine Verbindung mit dem angegebenen Server aufzubauen. 'ServerName$' kann eine IP-Adresse oder ein voller Name sein (z.B.: "127.0.0.1" oder "ftp.home.net").
php-freak hat geschrieben:Ich hab die IP von google auch ned rausgefunden!
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

SetForegroundWindow(hWnd) = SetForegroundWindow_(hWnd)

[EDIT]
Ha ich war schneller ;)
Zuletzt geändert von DarkDragon am 24.08.2005 10:40, insgesamt 1-mal geändert.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: PB versteht bestimmte API-befehle nicht !?!

Beitrag von Kiffi »

da fehlt der Unterstrich vor der Klammer:

Code: Alles auswählen

SetForegroundWindow_(hWnd)
[Edit]
@DD: Grrrrrrrrr!
Ich war aber schneller als Mücke
;-)
[/Edit]
Zuletzt geändert von Kiffi am 24.08.2005 10:43, insgesamt 1-mal geändert.
a²+b²=mc²
Benutzeravatar
mueckerich
Beiträge: 220
Registriert: 13.09.2004 11:33
Wohnort: Am schönsten Flecken der Erde, zwischen PC und Motorrad

Beitrag von mueckerich »

Da fehlt einfach ein Unterstrich. Schreib mal
SetForegroundWindow_(hWnd)
dann gehts. Es handelt sich hier um einen API- Aufruf, die werden durch einen Unterstrich am ende gekennzeichnet.

Edit: Okay Kiffi war schneller :allright:
Edit: :oops: Autsch, DD auch noch.
"Wenn Sie glauben, mich verstanden zu haben, dann habe ich mich falsch ausgedrückt" ( Alan Greenspan)
Dr.Pixel
Beiträge: 90
Registriert: 12.08.2005 12:38

Beitrag von Dr.Pixel »

OK, danke. Klappt.

Aber was ist hier falsch in der Datei "ListChildWindows.pb" aus dem Codearchiv:

Zeile 18: class$ = PeekS (MemoryID())


Fehlermeldung:
Zeile18: MemoryID() is not a function, an array, or a linked list
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

MemoryID gibts nichtmehr, man muss den rückgabewert von AllocateMemory(DerzweiteParameter) speichern und anstatt MemoryID() benutzen.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

alternativ kannst Du den Klassennamen und Fenstertitel auch mit diesen
beiden Routinen ermitteln:

Auszug aus NTCs EnumAllWindows V3:

Code: Alles auswählen

Procedure.s GetClassName(handle.l)
  Class.s = Space(#BufferSize)
  GetClassName_(handle, @Class, Len(Class))
  ProcedureReturn Left(Class, Len(Class))
EndProcedure

Procedure.s GetTitle(handle)
  Name.s = Space(#BufferSize)
  GetWindowText_(handle, @Name, Len(Name))
  ProcedureReturn Left(Name, Len(Name))
EndProcedure 
der Aufruf erfolgt dann mit:

Code: Alles auswählen

class$ = GetClassName(window)
und

Code: Alles auswählen

title$ = GetTitle(window) 
Grüße ... Kiffi
a²+b²=mc²
Dr.Pixel
Beiträge: 90
Registriert: 12.08.2005 12:38

Beitrag von Dr.Pixel »

Also, ich habe das Programm nun umgeschrieben.
Trotzdem kommt folgende FM:
[ERROR] ListChildWindows.pb (Line 20): "Class.s = Space(#BufferSize)"
[ERROR] Invalid Memory access.

Was mache ich falsch?

Code: Alles auswählen

#BufferSize = 2048 


Procedure.s GetClassName(handle.l) 
  Class.s = Space(#BufferSize) 
  GetClassName_(handle, @Class, Len(Class)) 
  ProcedureReturn Left(Class, Len(Class)) 
EndProcedure 

Procedure.s GetTitle(handle) 
  Name.s = Space(#BufferSize) 
  GetWindowText_(handle, @Name, Len(Name)) 
  ProcedureReturn 
EndProcedure 



Procedure ListChildWindows (window, parameter) 

    GetClassName_ (window, ReAllocateMemory (0, 255), 255) 
    ;class$ = PeekS (MemoryID ())
    class$ = GetClassName(window) 


    GetWindowText_ (window, ReAllocateMemory (0, 255), 255) 
    AllocateMemory(DerzweiteParameter) 
    ;title$ = PeekS (MemoryID ()) 
    title$ = GetTitle(window) 

    FreeMemory (0) 
    
    For a = 1 To parameter 
        sub$ = sub$ + "--------" 
    Next 
    
    Debug sub$ + ">" + Chr (34) + title$ + Chr (34) + " / Class: " + class$ 

    EnumChildWindows_ (window, @ListChildWindows (), parameter + 1) 

    ProcedureReturn #True 
    
EndProcedure 

; List top-level windows... 

Procedure ListWindows (window, parameter) 

    GetClassName_ (window, ReAllocateMemory (0, 255), 255) 
    ;class$ = PeekS (MemoryID ()) 
    class$ = GetClassName(window)

    GetWindowText_ (window, ReAllocateMemory (0, 255), 255) 
    ;title$ = PeekS (MemoryID ()) 
    title$ = GetTitle(window) 

    FreeMemory (0) 
    
    Debug "" 
    Debug "------------------------------------------------------------------------" 
    Debug Chr (34) + title$ + Chr (34) + " / Class: " + class$ 
    Debug "------------------------------------------------------------------------" 
    
    EnumChildWindows_ (window, @ListChildWindows (), 1) 
    
    ProcedureReturn #True 
    
EndProcedure 

EnumWindows_ (@ListWindows (), 0) 
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

ungetestet:

Code: Alles auswählen


#BufferSize = 2048


Procedure.s GetClassName(handle.l)
  Class.s = Space(#BufferSize)
  GetClassName_(handle, @Class, Len(Class))
  ProcedureReturn Left(Class, Len(Class))
EndProcedure

Procedure.s GetTitle(handle)
  Name.s = Space(#BufferSize)
  GetWindowText_(handle, @Name, Len(Name))
  ProcedureReturn
EndProcedure

Procedure ListChildWindows (window, parameter)
  
  class$ = GetClassName(window)
  
  title$ = GetTitle(window)
  
  For a = 1 To parameter
    sub$ = sub$ + "--------"
  Next
  
  Debug sub$ + ">" + Chr (34) + title$ + Chr (34) + " / Class: " + class$
  
  EnumChildWindows_ (window, @ListChildWindows (), parameter + 1)
  
  ProcedureReturn #True
  
EndProcedure

; List top-level windows...

Procedure ListWindows (window, parameter)
  
  class$ = GetClassName(window)
  
  title$ = GetTitle(window)
  
  Debug ""
  Debug "------------------------------------------------------------------------"
  Debug Chr (34) + title$ + Chr (34) + " / Class: " + class$
  Debug "------------------------------------------------------------------------"
  
  EnumChildWindows_ (window, @ListChildWindows (), 1)
  
  ProcedureReturn #True
  
EndProcedure

EnumWindows_ (@ListWindows (), 0)
 
a²+b²=mc²
Antworten