Wenn ich die Funktion TaskDialogIndirect() der Datei comctr32.dll aufrufe erhalte ich eine AccessViolationException, welche auch durch einen try-Block nicht zurück gehalten werden kann. Aber erstmal „etwas“ Code:
Die Funktion:
Microsofts Definition:
(http://msdn.microsoft.com/de-de/library/bb760544%28v…)
HRESULT TaskDialogIndirect(
\_\_in const TASKDIALOGCONFIG \*pTaskConfig,
\_\_out int \*pnButton,
\_\_out int \*pnRadioButton,
\_\_out BOOL \*pfVerificationFlagChecked
);
Meine Umsetzung
(Quelle: MicrosoftAPICodePack)
[DllImport( "Comctl32.dll", SetLastError = true )]
internal static extern HRESULT TaskDialogIndirect(
[In] TaskDialogConfiguration taskConfig,
[Out] out int button,
[Out] out int radioButton,
[MarshalAs( UnmanagedType.Bool ), Out] out bool verificationFlagChecked
);
Mein Aufruf:
int a = 0;
int b = 0;
bool c = false;
tdconfig.callback = new API.TaskDialogCallback( HandleTDMessage );
tdconfig.callbackData = parent;
tdconfig.size = (uint)Marshal.SizeOf( tdconfig );
try
{
API.TaskDialogIndirect( tdconfig, out a, out b, out c );
}
catch(AccessViolationException e)
{
}
Ich hoffe ihr könnt mir Helfen oder zumindest einen Tipp geben wo der fehler liegt. Desweiteren würde es mich interressiert warum sich die Anwendung trotz des try-catch aufhängt
Hallo!
Vorschlag: Bevor Du Dir selbst wegen der korrekten Definition der interop-Definitionen den Kopf zerbrichst (daran liegt es nämlich mit Sicherheit), kannst Du das Windows API CodePack verwenden, das MS für den verwalteten Zugriff auf die neueren Vista/Win7 Features veröffentlicht hat:
http://code.msdn.microsoft.com/WindowsAPICodePack
Gruß,
Martin
Ich will es aber auch selber verstehen/schaffen. mein Fehler lag übrigens daran das ich TaskDialogConfig nicht als Klasse sondern als struct definiert hatte.
Mit dem APICodePack habe ich allerdings das problem das keine Icons angezeigt werden.
Hallo nochmal!
IIRC ist beim API CodePack auch der Sourcecode dabei.
Wenn Du die TaskDialogConfig als struct definierst, dann ginge das auch, Du müsstest es dann nur mit „ref“ übergeben.
Gruß,
Martin
Hallo nochmal!
Hallo
IIRC ist beim API CodePack auch der Sourcecode dabei.
Natürlich, das benutze ich ja auch als Nachschlagewerk, wobei die Icons bei mir, wie ich ja bereits erwähnte ja nicht funktionieren
Wenn Du die TaskDialogConfig als struct definierst, dann ginge
das auch, Du müsstest es dann nur mit „ref“ übergeben.
aha, danke
Gruß,
Martin
grüße zurück
Hi nochmal!
Ich hab’ mir das CodePack auch mal heruntergeladen und ausprobiert.
Bei den TaskDialog Samples bekomme ich beim „Test Harness“ auch keine Icons, beim „Icons Sample“ klappt es aber.
Auf den ersten Blick fällt mir auch nicht auf, was dort anders gemacht würde.
Falls Du es herausbekommst, würde es mich auch interessieren - schreibst Du’s dann hier rein?
Gruß,
Martin
Falls Du es herausbekommst, würde es mich auch interessieren - schreibst Du’s dann hier rein?
Habs hinbekommen:
also die defninition der Icons ist laut msdn und der commctrl.h folgende:
(wobei ich nich verstehe welchen sinn es hat einen String als icon zu übergeben)
[...]
union
{
HICON hMainIcon;
PCWSTR pszMainIcon;
}
bzw.
union
{
HICON hFooterIcon;
PCWSTR pszFooterIcon;
}
Das APICodePack setzt das dann mithilfe einer struktur um:
internal IconUnion mainIcon; // NOTE: 32-bit union field, holds pszMainIcon as well
internal IconUnion footerIcon; // NOTE: 32-bit union field, holds pszFooterIcon as well
// NOTE: We include a "spacer" so that the struct size varies on
// 64-bit architectures.
[StructLayout(LayoutKind.Explicit, CharSet = CharSet.Auto)]
internal struct IconUnion
{
internal IconUnion(int i)
{
mainIcon = i;
spacer = IntPtr.Zero;
}
[FieldOffset(0)]
private int mainIcon;
// This field is used to adjust the length of the structure on 32/64bit OS.
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
[FieldOffset(0)]
private IntPtr spacer;
[///]
public int MainIcon { get { return mainIcon; } }
}
Ich habs einfach als IntPtr definiert:
internal IntPtr hMainIcon;
bzw
internal IntPtr hFooterIcon;
und so kann ich jetzt entweder eines der vordefinerten Icons als Integer übergeben ( wobei die icons der imageres.dll ) auch funktionieren, oder ich kann, wenn ich
TDF\_USE\_HICON\_MAIN = 0x0002,
bzw.
TDF\_USE\_HICON\_FOOTER = 0x0004,
setze die eigenschaft Handle eines System.Drawing.Icon-Objektes übergeben.