Seite 1 von 2

kompilieren mit PB 5.4 Beta 1 API-Aufrufe

Verfasst: 31.08.2015 21:01
von NicknameFJ
Hallo zusammen,

die 5.40 Beta 1 ist raus :D ***freu***

aber

aus der Registry.pbi von ts-soft habe ich dieses Stück Code

Code: Alles auswählen

  Structure RegValue
    TYPE.l      ; like: #REG_BINARY, #REG_DWORD ...
    SIZE.l
    ERROR.l
    ERRORSTR.s
    DWORD.l     ; #REG_DWORD
    QWORD.q     ; #REG_QWORD
    *BINARY     ; #REG_BINARY
    STRING.s    ; #REG_EXPAND_SZ, #REG_MULTI_SZ, #REG_SZ
  EndStructure

  Procedure.s GetLastErrorStr(error)
    Protected Buffer.i, result.s
   
    If FormatMessage_(#FORMAT_MESSAGE_ALLOCATE_BUFFER | #FORMAT_MESSAGE_FROM_SYSTEM, 0, error, 0, @Buffer, 0, 0)
      result = PeekS(Buffer)
      LocalFree_(Buffer)
     
      ProcedureReturn result
    EndIf
  EndProcedure

  Procedure.i XP_DeleteTree(topKey, KeyName.s, *Ret.RegValue = 0)
    Protected hKey, error, dwSize.l, sBuf.s = Space(260)
   
    If Left(KeyName, 1) = "\"  : KeyName = Right(KeyName, Len(KeyName) - 1) : EndIf
    If Right(KeyName, 1) = "\" : KeyName = Left(KeyName, Len(KeyName) - 1)  : EndIf
   
    If *Ret <> 0
      ClearStructure(*Ret, RegValue)
    EndIf
   
    error = RegOpenKeyEx_(topKey, KeyName, 0, #KEY_ENUMERATE_SUB_KEYS, @hKey)
    If error
      If *Ret <> 0
        *Ret\ERROR = error
        *Ret\ERRORSTR = GetLastErrorStr(error)
      EndIf
      Debug GetLastErrorStr(error)
      If hKey
        RegCloseKey_(hKey)
      EndIf
      ProcedureReturn #False
    EndIf
   
    Repeat
      dwSize.l = 260
      error = RegEnumKeyEx_(hKey, 0, @sBuf, @dwSize, 0, 0, 0, 0)
      If Not error
        XP_DeleteTree(hKey, sBuf)
      EndIf
    Until error
    RegCloseKey_(hKey)
    error = RegDeleteKey_(topKey, KeyName)
    If error
      If *Ret <> 0
        *Ret\ERROR = error
        *Ret\ERRORSTR = GetLastErrorStr(error)
      EndIf
      Debug GetLastErrorStr(error)
      ProcedureReturn #False
    EndIf
   
    ProcedureReturn #True   
  EndProcedure
 
kompiliert mit 5.24 und 5.31 einwandfrei jedoch nicht mit 5.40

Fehler

Code: Alles auswählen

---------------------------
PureBasic
---------------------------
Zeile 33: Falscher Parameter-Typ, Zahl anstelle eines Strings erwartet.
---------------------------
OK   
---------------------------
in dieser Zeile

Code: Alles auswählen

    error = RegOpenKeyEx_(topKey, KeyName, 0, #KEY_ENUMERATE_SUB_KEYS, @hKey)

Verstehe ich gerade nicht, da RegOpenKeyEx ein WinApi-Aufruf ist. Ich bin mir fast sicher dass Microsoft hier nichts geändert hat :mrgreen:

Warum will der Compiler 5.40 dass KeyName eine Zahl ist???

Wohlgemerkt: 5.24 LTS und 5.31 komilieren problemlos


Der selbe Fehler tritt in allen Proceduren auf - aus der Registry.pbi von ts-Soft - in denen

Code: Alles auswählen

error = Reg???????_() 
aufgerufen wird und der String übergeben wird. KeyName (als String) wird immer angemeckert dass hier eine Zahl erwartet wird.


Jemand eine Idee?

Danke

NicknameFJ

Re: kompilieren mit PB 5.4 Beta 1

Verfasst: 31.08.2015 21:06
von _JON_
Schein ein Bug zu sein: http://www.purebasic.fr/english/viewtop ... =4&t=62978

Alle API's die normalerweise "Strings" akzeptieren wollen nun *Pointer:
error = RegOpenKeyEx_(topKey, @KeyName, 0, #KEY_ENUMERATE_SUB_KEYS, @hKey)

Re: kompilieren mit PB 5.4 Beta 1

Verfasst: 31.08.2015 21:12
von NicknameFJ
Danke _JON_ für den Link ins Englische. Da habe ich noch nicht geschaut.

Ich probiere dann mal ob ich es hinbekomme sonst melde ich mich nochmal

NicknameFJ

Re: kompilieren mit PB 5.4 Beta 1

Verfasst: 31.08.2015 21:18
von ts-soft
Die neu Importierten API Libs, wollen jetzt Pointer statt Strings, da der Importeur ja nicht Wissen kann, was da benötigt wird.
Ob Fred das so läßt oder die zig tausende von API aufrufen anpaßt weiß ich nicht. Viel schlimmer wird es aber bei Quads, Double
usw. sein :mrgreen:

Am besten die API selbst importieren!

Gruß
Thomas

Re: kompilieren mit PB 5.4 Beta 1

Verfasst: 31.08.2015 22:53
von c4s
ts-soft hat geschrieben:[...] Ob Fred das so läßt oder die zig tausende von API aufrufen anpaßt weiß ich nicht. Viel schlimmer wird es aber bei Quads, Double usw. sein
Ziel ist es wohl alles, mit Hilfe der User, entsprechend anzupassen:
Fred hat geschrieben:[...] We also published all the API imports file on the same SVN than the documention (available for all in read-only), so if you want to help to improve them (by putting the right type where needed, or changing the argument names to be more explicits) you can check out it and publish the patches: svn://svn.purebasic.fr/home/svn/Documentation/v5.40
Edit:
Hier der offizielle Thread zum Thema: http://www.purebasic.fr/english/viewtop ... =4&t=62995

Re: kompilieren mit PB 5.4 Beta 1

Verfasst: 04.09.2015 17:54
von ts-soft
Die registry_module.pbi ist gefixed: http://www.purebasic.fr/english/viewtop ... 72#p422572

Re: kompilieren mit PB 5.4 Beta 1

Verfasst: 04.09.2015 18:08
von NicknameFJ
Danke ts-soft :allright:

Re: kompilieren mit PB 5.4 Beta 1

Verfasst: 08.09.2015 08:39
von lite
Hallo

Eine Frage. Mit der neuen Beta 5.40 -3 ändern sich die Win-API-Aufrufe.
Das ist mir klar.

Code: Alles auswählen

SendMessage_(GadgetID(#e_procmsg),#EM_REPLACESEL,0,"text"+#CRLF$)
Wie kann ich direkt einen Pointer einer Zeichenkette verwenden ?

Mit einem direkten @Zeichen davor geht es nicht. Gibt es da eine schreibweise wie er direkte Zeichenketten als Pointer in PureBasic verarbeiten kann.

Code: Alles auswählen

SendMessage_(GadgetID(#e_procmsg),#EM_REPLACESEL,0,@"text"+#CRLF$)
Grüße

Lite

Re: kompilieren mit PB 5.4 Beta 1

Verfasst: 08.09.2015 09:12
von Kiffi
nicht ganz so direkt, wie Du es wahrscheinlich gerne haben möchtest:

Code: Alles auswählen

la.s = "text"+#CRLF$
SendMessage_(GadgetID(#e_procmsg),#EM_REPLACESEL,0,@la)
Grüße ... Peter

Re: kompilieren mit PB 5.4 Beta 1

Verfasst: 08.09.2015 09:14
von _JON_
lite hat geschrieben:

Code: Alles auswählen

SendMessage_(GadgetID(#e_procmsg),#EM_REPLACESEL,0,"text"+#CRLF$)
Wie kann ich direkt einen Pointer einer Zeichenkette verwenden ?
Direkt leider gar nicht. Also erst den String komplett zusammensetzen und dann die API aufrufen.

stext.s = "text"+#CRLF$
SendMessage_(GadgetID(#e_procmsg),#EM_REPLACESEL,0,@stext.s)

Allerdings gute nachrichten, Fred überlegt sich das ganze noch mal :allright: