| 

.NET C# Java Javascript Exception

2
Hallo zusammen.

Ich habe ein Problem mit der MAPILogon-Funktion.

Wenn ich eine Windows-Forms Anwendung erstelle und folgenden Code ausführe funktioniert die Anmeldung ohne Probleme:

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

[DllImport("MAPI32.DLL", CharSet = CharSet.Ansi)]
private static extern uint MAPILogon(IntPtr ulUIParam, string lpszProfileName, string lpszPassword, uint flFlags, uint ulReserved, ref IntPtr lplhSession);

[DllImport("MAPI32.DLL", CharSet = CharSet.Ansi)]
private static extern uint MAPILogoff(IntPtr lhSession, IntPtr ulUIParam, uint flFlags, uint ulReserved);


private const int MAPI_NEW_SESSION = 0x00000002; /* Don't use shared session */
private const int MAPI_LOGON_UI = 0x00000001; /* Display logon UI */

private void Form1_Load(object sender, EventArgs e)
{
IntPtr session = IntPtr.Zero;
uint error = MAPILogon(IntPtr.Zero, null, null, MAPI_NEW_SESSION, 0, ref session);

textBox1.Text = error.ToString();

if (session != IntPtr.Zero)
{
MAPILogoff(session, IntPtr.Zero, 0, 0);
}

}
}


Wenn ich den gleichen Code in einer Consolen-Anwendung ausführe kommt ein Errorcode 3 zurück. Hier der Code der Consolen-Anwendung:
class Program
{
[DllImport("MAPI32.DLL", CharSet = CharSet.Ansi)]
private static extern uint MAPILogon(IntPtr ulUIParam, string lpszProfileName, string lpszPassword, uint flFlags, uint ulReserved, ref IntPtr lplhSession);

[DllImport("MAPI32.DLL", CharSet = CharSet.Ansi)]
private static extern uint MAPILogoff(IntPtr lhSession, IntPtr ulUIParam, uint flFlags, uint ulReserved);

private const int MAPI_NEW_SESSION = 0x00000002; /* Don't use shared session */
private const int MAPI_LOGON_UI = 0x00000001; /* Display logon UI */

static void Main(string[] args)
{
IntPtr session = IntPtr.Zero;
uint error = MAPILogon(IntPtr.Zero, null, null, MAPI_NEW_SESSION, 0, ref session);


Console.WriteLine(error.ToString());

if (session != IntPtr.Zero)
{
MAPILogoff(session, IntPtr.Zero, 0, 0);
}

Console.ReadLine();
}
}


Fehler 3 besagt laut MSDN das es sich um einen LOGOn-Fehler handelt.

Wie kann das sein? Warum funktioniert die Anmeldung in einer WinForm-Anwendung, aber nicht in einer Consolen-Anwendung?

Ich habe auch schon ein wenig mit den Flags-Parameter herumgespielt, aber es kommt immer wieder Fehlercode 3 zurück.

Hat jemand einen Ahnung was hier passiert ??

Danke im Voraus.
23.08.2012
multi1209 848 1 8
2 Antworten
2
Hm, wie läuft denn das Einloggen? Du übergibst keine Credentials, also müßte ein Login-Dialog kommen, oder? Könnte es sein, [spekulier]dass das nur in einem Win32-Kontext funktioniert[/spekulier]? Siehe auch den ersten Parameter von MAPI-Login - ich verstehe die Doku so, dass der nur null sein darf, wenn kein Login-Dialog gebraucht wird; sonst wird ein Window-Handle erwartet.

Ansonsten: es stehen ein Haufen "willst Du das wirklich?"-Warnschilder am Weg:

Microsoft Important Note: MAPI32 is not supported in a managed environment, memory leaks may be seen. Use the current alternatives: System.Net.Mail or WebDav or Exhange 2007 webservice interface.
http://pinvoke.net/default.aspx/mapi32.MAPILogon

The use of this function is discouraged. It may be altered or unavailable in subsequent versions of Windows.
http://msdn.microsoft.com/en-us/library/windows/desktop/dd296726%28v=vs.85%29.aspx

Um das halbwegs ordentlich zu machen dürfte der Aufwand bei ca. 500-800 LOC liegen.
http://social.msdn.microsoft.com/Forums/de-DE/dotnetframeworkde/thread/3eaa352a-896d-4166-ac57-5ed7d7c6bde3/
25.08.2012
Matthias Hlawatsch 13,2k 4 9
Ich will MAPI eigentlich auch nicht benutzen, aber es wird so gewollt, also bin ich machtlos :-) Ich habe auch schon mit den verschiedenen Parametern gespielt. Da ich kein Profilnamen angeben, wird das Standardprofil verwendet, was ja auch in WinForms klappt. Ebenso habe ich schon mit den Window-Handles gespielt und dieses in beiden Versionen ausprobiert, aber egal was ich probiere es kommt immer Fehler 3 zurück. Danke auch für die Links, ein paar kannte ich auch schon und ich werde weiter versuchen MAPI durch was anderes zu ersetzen.
multi1209 27.08.2012
1
Hast Du schon mal die statische Code Analyse auf Deiner Applikation ausgeführt?

Neben dem Hinweis auf eine nativeMethods Klasse ...
Warnung 2 CA1060 : Microsoft.Design : Als P/Invoke-Methode muss 'Program.MAPILogon(IntPtr, string, string, uint, uint, ref IntPtr)' in einer Klasse mit dem Namen NativeMethods, SafeNativeMethods oder UnsafeNativeMethods definiert werden. J:\Spielwiese\ConsoleApplication1\ConsoleApplication1\Program.cs 16 ConsoleApplication1

... gibt es aber auf jeden Fall noch weitere Hinweise:
Warnung 3 CA2101 : Microsoft.Globalization : Um Sicherheitsrisiken zu verringern, marshallen Sie den 'lpszProfileName'-Parameter als Unicode, indem Sie DllImport.CharSet auf CharSet.Unicode festlegen oder den Parameter explizit als UnmanagedType.LPWStr marshallen. Wenn Sie diese Zeichenfolge als ANSI oder systemabhängig marshallen müssen, geben Sie MarshalAs explizit an, und legen Sie "BestFitMapping=false" fest. Legen Sie zur Erhöhung der Sicherheit auch "ThrowOnUnmappableChar=true" fest. J:\Spielwiese\ConsoleApplication1\ConsoleApplication1\Program.cs 16 ConsoleApplication1


Keine Ahnung, ob in diesen Punkten dann Unterschiede zwischen Forums und Consolen Anwendung entstehen können.
23.08.2012
Xantiva 2,3k 2 9
Danke für die Anregungen, aber damit hat es auch nicht geklappt. Nebenbei gefragt, welches Tool für die statische Code Analyse hast Du verwendet?
multi1209 24.08.2012
Die statische Code Analyse von Visual Studio (Ultimate).
Xantiva 24.08.2012

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH