Seite 1 von 1
Speicherproblem!
Verfasst: 22.03.2006 12:48
von Pelagio
Der folgende Code ergibt einen Fehler:
Code: Alles auswählen
;/Ermittlung des Dateipfades
;/[Value.s] = GetPath(#False/#True) | Temp-/Aktuelles Verzeichnis
Procedure.s GetPath(Verzeichnis.b)
Buffer.s = Space (255)
Select Verzeichnis
Case #False
GetTempPath_(255,Buffer)
Case #True
Buffer = Left(Buffer, GetFullPathName_("*", 255, Buffer, ""))
EndSelect
ProcedureReturn GetPathPart(Buffer)
EndProcedure
BasePath.s = GetPath(#True)
;BasePath.s = "C:\"
If OpenWindow(0, 0, 0, 200, 100, "TestGadget", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
If CreateGadgetList(WindowID(0))
StringGadget(1, 10, 10, 180, 80, BasePath)
EndIf
EndIf
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
1)Wird die Variable BasePath mit Getpath(#True) gefüllt, so fehlt beim Fenstertitel der erste Buchstabe und die variable wird nicht im Gadget angezeigt.
2) Wird die Variable erst mit GetPath(#True) gefüllt und dann mit "C:\", so wird der Fenstertitel korrekt wiedergegeben, aber das erste Zeichen (C) im Gadget wird nicht richtig wiedergegeben.
3)Lasse ich GetPath(#True) weg und füll die Variable nur mit "C:\" so funktioniert es.
4) GetPath(#False) funktioniert.
Warum Wieso Weswegen?

Verfasst: 22.03.2006 13:20
von bobobo
mit ausgeschaltetem Debugger zeigt er bei "#True"
übrigens gar keinen Windowtitle an.
ist irgendwie ein älterer Bug und gehört scho lange gemeldet
Mit folgendem Code kann man in 3.94 je nachdem
ob die Zeile BasePath.s="C:" auskommentiert ist oder nicht den Windowtitle anzeigen lassen oder den Inhalt des StringGadgets
In Beta4 geht das mit ausgeschaltetem Debugger
Code: Alles auswählen
Buffer.s = Space (255)
Buffer.s = Left(Buffer,GetFullPathName_("*", 255, Buffer, ""))
BasePath.s=GetPathPart(Buffer)
BasePath.s = "C:\"
If OpenWindow(0, 0, 0, 200, 100, #PB_Window_SystemMenu|#PB_Window_ScreenCentered, "TestGadget")
If CreateGadgetList(WindowID(0))
StringGadget(1, 10, 10, 180, 80, BasePath)
EndIf
EndIf
Debug GetWindowTitle(0)
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
Ich meld das mal weiter
Verfasst: 22.03.2006 16:50
von FGK
@Pelagio
kann zwar den Bug nachvollziehen aber habe spitzfindig wie ich bin,
auch noch eine "kleine Programmierfalle" entdeckt.
In deinem Code initialisiert du deinen Buffer mit Länge 255 -
das ist genaugenommen nicht richtig - denn dazu gibt es die
Konstante #MAX_PATH die laut MSD mit 260 deklariert ist und
auch in PB existiert und sicherstellt daß auch der vom OS
zulässige maximale Pfad noch aufgenommen werden kann.
Wie gesagt "spitzfindig" aber .....
Gruß
FGK
Verfasst: 22.03.2006 20:48
von Nik
Dann mal ab damit ins englische Forum
Verfasst: 23.03.2006 09:57
von ABBKlaus
@FGK ,
stimmt nicht :
http://msdn.microsoft.com/library/defau ... thname.asp
If the lpBuffer buffer is too small to contain the path, the return value is the size of the buffer that is required to hold the path and the terminating null character, in TCHARs. Therefore, if the return value is greater than nBufferLength, call the function again with a buffer that is large enough to hold the path.
kleiner Ausschnitt aus dem Beispielcolde der MSDN
Code: Alles auswählen
#include <windows.h>
#include <stdio.h>
#define BUFSIZE 4096
int main(int argc, char *argv[])
{
DWORD retval=0;
BOOL success;
char buffer[BUFSIZE]="";
char * lpPart[BUFSIZE]={NULL};
// Retrieve a full path name for a file. The file does not need to
// exist.
retval = GetFullPathName("c:\\testfile.txt",
BUFSIZE,
buffer,
lpPart);
ein Buffer von 255 ist kein Fehler
