Winapi und Filerequester

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

mpz

Betreff: Winapi und Filerequester

BeitragMo, Jan 26, 2004 17:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Leute,

wer hat sich von Euch schon an die WINAPI Befehle rangetraut? Ich versuche gerade den GetOpenFileName (*Openfile) Befehl zu verwenden. Wenn es funktioniert, benötigt man für einen Filerequester keine zusätzliche *.dll Datei (z.B. Winsys.dll). Leider wird der Befehl nicht ausgeführt, was natürlich (Sch... Twisted Evil ) ist. Also folgendes habe ich schon versucht:

Code: [AUSKLAPPEN]

; comdlg.decls im USERLIBS Verzeichnis
.lib "comdlg32.dll"
api_GetOpenFileName% (pOpenfilename*) : "GetOpenFileNameA"

; kernel32.decls im USERLIBS Verzeichnis
.lib "kernel32.dll"
api_GetLastError% () : "GetLastError"




Dann nur noch mein (nicht funktionsfähiges) Programm:

Code: [AUSKLAPPEN]


Type OPENFILENAME ; Structur des Buffers (pOpenfilename*)
  Field lStructSize%
  Field hwndOwner%
  Field hInstance%
  Field lpstrFilter$
  Field lpstrCustomFilter$
  Field nMaxCustFilter%
  Field nFilterIndex%
  Field lpstrFile$
  Field nMaxFile%
  Field lpstrFileTitle$
  Field nMaxFileTitle%
  Field lpstrInitialDir$
  Field lpstrTitle$
  Field flags%
  Field nFileOffset%
  Field nFileExtension%
  Field lpstrDefExt$
  Field lCustData%
  Field lpfnHook%
  Field lpTemplateName$
End Type


test.OPENFILENAME= New OPENFILENAME
test\lStructSize = 591
test\hwndOwner = hwndHandle;Me.hWnd
test\hInstance = 0;App.hInstance
test\lpstrFilter$ = "All Files (*.*)" + Chr$(0) + "*.*" + Chr$(0)
test\lpstrFile$= String$ (" ", 254)
test\nMaxFile=254
test\lpstrFileTitle$=String$ (" ", 254)
test\nMaxFileTitle=254
test\lpstrInitialDir$="C:\"
test\lpstrTitle$="test"
test\flags = 0

api_GetOpenFileName (test)   
Print api_GetLastError ()

While MouseHit(1) <> 1
Wend



Leider erscheint nur der Fehler (über api_GetLastError ()) 87 = heisst falsche Parameter. Habe es auch schon mit:

Code: [AUSKLAPPEN]

theBank=CreateBank(591)
lStructSize=591
PokeInt theBank,0,lStructSize
hwndOwner=0
PokeInt theBank,4,hwndOwner
hInstance=0
PokeInt theBank,8,hInstance
lpstrFilter$ = "All Files (*.*)" + Chr$(0) + "*.*" + Chr$(0)
nextOffset=copyStringToBankZT(lpstrFilter$,theBank,12)
lpstrCustomFilter$= ""
nextOffset=copyStringToBankZT(lpstrCustomFilter$,theBank,nextOffset)
nMaxCustFilter=0
PokeInt theBank,nextOffset,nMaxCustFilter
nFilterIndex=0
PokeInt theBank,nextOffset+4,nFilterIndex
lpstrFile$= String$ (" ", 254)
nextOffset=copyStringToBankZT(lpstrFile$,theBank,nextOffset+8)
nMaxFile=255
PokeInt theBank,nextOffset,nMaxFile
lpstrFileTitle$=String$ (" ", 254)
nextOffset=copyStringToBankZT(lpstrFileTitle$,theBank,nextOffset+4)
nMaxFileTitle=255
PokeInt theBank,nextOffset,nMaxFileTitle
lpstrInitialDir$="C:\"
nextOffset=copyStringToBankZT(lpstrInitialDir$,theBank,nextOffset+4)
lpstrTitle$="test"
nextOffset=copyStringToBankZT(lpstrTitle$,theBank,nextOffset)
flags=0
PokeInt theBank,nextOffset,flags
nFileOffset=0
PokeInt theBank,nextOffset+4,nFileOffset
nFileExtension=0
PokeInt theBank,nextOffset+8,nFileExtension
lpstrDefExt$=""
nextOffset=copyStringToBankZT(lpstrDefExt$,theBank,nextOffset+12)
lCustData=0
PokeInt theBank,nextOffset,lCustData
lpfnHook=0
PokeInt theBank,nextOffset+4,lpfnHook
lpTemplateName$=""
nextOffset=copyStringToBankZT(lpTemplateName$,theBank,nextOffset+8)

api_GetOpenFileName (theBank)
Print api_GetLastError ()
While MouseHit(1) <> 1
Wend

Function copyStringToBankZT(theString$, theBank, theOffset)
   While (Len(theString$)>0)
      PokeByte theBank,theOffset,Asc(Left$(theString$,1))
      theOffset=theOffset+1
      theString$=Right$(theString$,Len(theString$)-1)   
   Wend
   PokeByte theBank,theOffset,0
   Return theOffset+1
End Function


versucht, aber die Rettung kommt sicherlich, wenn Ihr mir weiterhelft. Also ran an die Tips, Ihr Götter der Blitzschreibweise

Very Happy
Michael

Vertex

BeitragMo, Jan 26, 2004 17:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Finde jetzt nichtmehr mein Example, aber Du musst an den ganzen
LPTSTR's die Adresse der Banks übergeben, in denen die Strings
gespeichert sind.
Dazu brauchst Du meine AdressOf-Funktion:
Code: [AUSKLAPPEN]

Function AddressOf(Bank)
   Local Address = CreateBank(4)
   RtlMoveMemory2(Address,Bank+4,4)
   Return PeekInt(Address,0)
End Function

Zitat:

.lib "Kernel32.dll"
RtlMoveMemory(Destination*,Source,Length) : "RtlMoveMemory"

AdressOf(Bank) liefert Dir dann die Adresse der jeweiligen Bank zurück,
in dem ein String gepoket sein sollt (nutz dazu Deine copyStringToBankZT
Funktion)
mfg olli
vertex.dreamfall.at | GitHub
 

mpz

BeitragMo, Jan 26, 2004 18:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry, das habe ich nicht genau verstanden. Heißt das das in den LPTSTRs keine Strings stehen, sondern die Adressen der Strings?

Adressen, Pointer usw. bei dreht sich im Moment alles im Kreis. Hast Du ein Beispiel? Oder kannst Du diesen Code funktionsfähig machen?

Danke,
Michael
Shocked Confused Shocked Confused
 

René Meyer

BeitragMo, Jan 26, 2004 19:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Dieser Befehl ist Dir bekannt? :)

http://www.blitzbase.de/befehlegui/requestfile.htm
www.blitzbasic.de | Das Buch zu Blitz Basic: www.schreibfabrik.de/txt/bbb
 

mpz

BeitragDi, Jan 27, 2004 12:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, aber leider habe ich mit Blitz Basic angefangen (nicht BlitzPlus!) und dann auf Blitz 3D erweitert. BlitzBasic 3D hat diesen Befehl nicht. Die Erweiterungen wie Filerequester könnte ich mit Purebasic als *.DLL schreiben oder die Blitzsys.dll benutzen, aber das MUSS dich einfacher gehen! Da meine Applikation aber mit Bitz 3D geschrieben wird, möchte ich nicht ein zusätzliche DLL Datei verwenden (Störisch, aber warum nicht?) Die WINAPI Befehle laden doch dazu ein Sie zu benutzen! Ich brauch nur noch den Anstoss einer Brechstange. 8) Und schon kann man wunderbare API Befehle benutzen...

Gruß Michael
 

mpz

BeitragDo, Jan 29, 2004 3:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Lösung habe ich gefunden und als Code reingestellt. Danke für die Tips

Michael

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group