Filedialog mittels API: Struktur OpenFilename/OFS?

09/04/2009 - 21:18 von Wolfgang Badura | Report spam
Hallo liebe NG-Teilnehmer!
Ich habe auf der Site
http://www.xtremedotnettalk.com/showthread.php?t‘981
Code zum Aufruf eines Filedialoges via API gefunden.
Ich wollte eine Rückrufprozedur zur Positionierung des Dialogfensters
nutzen.
Der Code funktioniert.
Aber wenn ich die Structur nicht mittels der Klasse OpenFileName definiere
sondern
eine identísch aufgebaute Struktur mit
'<StructLayout(LayoutKind.Sequential)> _
'Public Structure OFS
' Dim lStructSize As Integer
' Dim hwndOwner As IntPtr
' Dim hInstance As Integer
' <MarshalAs(UnmanagedType.LPTStr)> Dim lpstrFilter As String
' <MarshalAs(UnmanagedType.LPTStr)> Dim lpstrCustomFilter As String
' Dim nMaxCustFilter As Integer
' Dim nFilterIndex As Integer
' <MarshalAs(UnmanagedType.BStr)> Dim lpstrFile As String
' Dim nMaxFile As Integer
' <MarshalAs(UnmanagedType.LPTStr)> Dim lpstrFileTitle As String
' Dim nMaxFileTitle As Integer
' <MarshalAs(UnmanagedType.LPTStr)> Dim lpstrInitialDir As String
' <MarshalAs(UnmanagedType.LPTStr)> Dim lpstrTitle As String
' Dim flags As Integer
' Dim nFileOffset As Short
' Dim nFileExt As Short
' Dim lpstrDefExt As String
' Dim lCustData As IntPtr
' Dim lpfnHook As CallBackProc 'IntPtr
' <MarshalAs(UnmanagedType.LPTStr)> Dim lpTemplateName As String
' Dim ptrReserved As IntPtr
' Dim nReserved As Integer
' Dim nFlagsEx As Integer
'End Structure
definiere, mit
Dim m_OFS As New OFS
m_OFS instanziere
und
mit ipResult = GetOpenFileName(m_OFS)
die API aufrufe, erhalte ich den Fehler,
daß ich geschützes Memory lesen oder beschreiben möchte.
Die Lànge der beiden Strukturen sind identisch!
Wo könnte der Fehler liegen?

Vielleicht kann mir jemand helfen.

Wolfgang
 

Lesen sie die antworten

#1 Elmar Boye
09/04/2009 - 22:01 | Warnen spam
Hallo Wolfgang,

"Wolfgang Badura" schrieb im ...
Ich habe auf der Site
http://www.xtremedotnettalk.com/showthread.php?t‘981
Code zum Aufruf eines Filedialoges via API gefunden.



Ich habs nur überflogen, ab da ist einiges an Unsauberheiten drin.

Ich wollte eine Rückrufprozedur zur Positionierung des Dialogfensters nutzen.

Der Code funktioniert.
Aber wenn ich die Structur nicht mittels der Klasse OpenFileName definiere
sondern eine identísch aufgebaute Struktur mit



Wenn Du eine Struktur (wozu überhaupt?) nimmst, müsste der Aufruf
schon einmal ByRef sein, da ansonsten die Werte kopiert werden.

Nur einige der potentiellen Stolperfallen...

'<StructLayout(LayoutKind.Sequential)> _
'Public Structure OFS
' Dim lStructSize As Integer



StructSize muß die Größe der Struktur enthalten.
Darüber wird (wie auch bei anderen APIs) die Plattformerkennung gewàhrleistet,
da sich der Aufbau von OS Version in Größe und Aufbau unterscheiden kann.
(Sonst gibt es evtl. spàter Probleme wenn das Laufzeit OS àlter/neuer ist).


' Dim hwndOwner As IntPtr
' Dim hInstance As Integer



auch das wàre ein IntPtr

' <MarshalAs(UnmanagedType.LPTStr)> Dim lpstrFilter As String



Bei den Strings kann man es beim Standardmarshalling belassen.
und einiges mehr.

Eine bessere Vorlage erhàlst Du insgesamt, wenn Du den
.NET Reflector bemühst. In der Windows.Forms Assembly
existiert eine OPENFILENAME_I Klasse, die einen
korrekten Aufbau hat.

Gruß Elmar

Ähnliche fragen