vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Zippen wie die Profis!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2025
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

Fortgeschrittene Programmierung
Re: Problem mit GetOpenFileName auf 64bit-Systemen 
Autor: visualfx
Datum: 18.03.16 14:21

Hallo Wolfgang,

Du hast das Problem - oder sollte man besser sagen: das Chaos welches MS angerichtet hat - sehr gut zusammen gefaßt!

Alle Funktionen der Win32-API sind sogenannte C- bzw. C++ -Schnittstellen, d. h.: hier werden C- bzw. C++ -Strings übergeben und zurückgegeben - also keine VB6-Strings!!!

C/C++ -Strings sind einfache Zeichenketten und müssen am Ende immer durch (mindestens) ein CHR$(0) terminiert sein (ich sehe jetzt mal von Datentypen wie CBString, CString, BString und ähnlichen Konstrukten ab!), da der String ansonsten entweder unendlich lang wird, oder so lang wird bis im Speicher irgendwann mal zufälligerweise ein CHR$(0) erscheint!

Ein VB6-String dagegen ist ein richtiges Objekt, welches seine Länge intern vollständig selbst verwaltet und deshalb auch kein abschließendes CHR$(0) benötigt.

Gegenüber dem Datentyp String von VB6 bzw. dem geleichwertigen Datentyp STRING von Visual-Foxpro ist der C/C++ -String ein ganz einfaches Konstrukt ohne jegliche Funktionalität und ohne jeglichen Komfort.

Während man sich bei VB6 und auch Visual Foxpro NICHT um den benötigten Speicherplatz bzw. die Länge des Strings kümmern muß, muß bei C/C++ für den String genug Speicherplatz allokiert sein und der String muß am Ende (!!!) mit (mindestens) einem CHR$(0) abgeschlossen sein.

Noch abendteuerlicher wird es z. B. beim 4ten Strukturelement lpstrFilter und beim 5ten Strukturelement lpstrCustomFilter!!!

- siehe 2ter Link in meiner 2ten Antwort:

Das sind Paare von CHR$(0)-terminierten Filter-Strings. Das Ende des gesamten Strings wir durch ein doppeltes CHR$(0) markiert! Was für ein Graus!!!

Hierbei muß in nMaxCustFilter noch die Größe des Puffers lpstrCustomFilter gesetzt sein!

Hierbei bedeutet:

- LPCTSTR : Long Pointer Constant (0-)Terminated String

deshalb muß man bei diesem konstant langen Parameter auch nicht noch zusätzlich in einem 2ten Parameter seine Pufferlänge angeben!

- LPTSTR : Long Pointer (0-)Terminated String

deshalb muß man bei diesem variabel langen Parameter seine Pufferlänge in einem 2ten nachfolgenden Parameter angeben!

Bei C/C++ muß jeder String mit (mindestens) einem CHR$(0) abgeschlossen sein, also (0-)Terminated!

Das ist bei VB6 und Visual Foxpro NICHT so! siehe oben!

D. h. wenn man von VB6 einen String an eine C/C++ -Schnittstelle übergibt, würde ich zur Sicherheit immer ein CHR$(0) am Ende dranhängen! C/C++ erwartet CHR$(0)-terminierte Strings, ansonsten ist der String eventuell unendlich lang, bzw. so lang bis irgendwann mal im Speicher ein CHR$(0) gefunden wird.

Desweiteren muß bei C/C++ -Strukturen auch immer die Länge der Struktur-Elemente richtig gesetzt sein, z. B.:

- lStructSize: hier muß die Gesamtgröße der Struktur OPENFILENAME gesetzt sein

- nMaxCustFilter: hier muß die Größe des Puffers eingetragen sein auf den lpstrCustomFilter zeigt

- nMaxFile: hier muß die Größe des Puffers eingetragen sein auf den lpstrFile zeigt

- etc., etc., etc.

Sind die zugehörigen Puffer nicht groß genug, kommt es zu gnadenlosen Überschreibern im Speicher und die gesamte Anwendung wird evtl. sofort und ohne weitere Meldung kommentarlos beendet!

Gruß, Stefan
alle Nachrichten anzeigenGesamtübersicht  |  Zum Thema  |  Suchen

 ThemaViews  AutorDatum
Problem mit GetOpenFileName auf 64bit-Systemen4.279Wolfgang Schwarz02.03.16 18:27
Re: Problem mit GetOpenFileName auf 64bit-Systemen3.272Blackbox16.03.16 19:41
Re: Problem mit GetOpenFileName auf 64bit-Systemen3.507Wolfgang Schwarz16.03.16 23:24
Re: Problem mit GetOpenFileName auf 64bit-Systemen3.243visualfx17.03.16 12:01
Re: Problem mit GetOpenFileName auf 64bit-Systemen3.156Blackbox17.03.16 17:29
Re: Problem mit GetOpenFileName auf 64bit-Systemen3.456visualfx17.03.16 18:11
Re: Problem mit GetOpenFileName auf 64bit-Systemen3.196Blackbox17.03.16 19:09
Re: Problem mit GetOpenFileName auf 64bit-Systemen3.424visualfx17.03.16 19:44
Re: Problem mit GetOpenFileName auf 64bit-Systemen3.253Blackbox17.03.16 21:44
Re: Problem mit GetOpenFileName auf 64bit-Systemen3.214visualfx17.03.16 22:23
Re: Problem mit GetOpenFileName auf 64bit-Systemen3.257ModeratorDieter18.03.16 07:09
Re: Problem mit GetOpenFileName auf 64bit-Systemen3.262Wolfgang Schwarz18.03.16 08:39
Re: Problem mit GetOpenFileName auf 64bit-Systemen3.247visualfx18.03.16 14:21
Re: Problem mit GetOpenFileName auf 64bit-Systemen3.474Wolfgang Schwarz18.03.16 14:37
Re: Problem mit GetOpenFileName auf 64bit-Systemen3.306visualfx18.03.16 15:13
Re: Problem mit GetOpenFileName auf 64bit-Systemen3.469Rippler18.03.16 17:41
Re: Problem mit GetOpenFileName auf 64bit-Systemen3.311Blackbox18.03.16 18:02
Re: Problem mit GetOpenFileName auf 64bit-Systemen3.306Wolfgang Schwarz20.03.16 10:45
Re: Problem mit GetOpenFileName auf 64bit-Systemen3.327Blackbox20.03.16 11:18
Re: Problem mit GetOpenFileName auf 64bit-Systemen3.139Wolfgang Schwarz20.03.16 11:52
Re: Problem mit GetOpenFileName auf 64bit-Systemen3.357Blackbox20.03.16 17:40
Re: Problem mit GetOpenFileName auf 64bit-Systemen3.166Wolfgang Schwarz20.03.16 18:05
Re: Problem mit GetOpenFileName auf 64bit-Systemen3.092Blackbox20.03.16 18:16

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2025 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel