(13.07.2015 15:25 )daoberle schrieb: Hallo,
ich hab eine Frage an die eingefleischten Labviewer hier im Forum. Ich würde gerne die "credui.dll" Datei aus dem Windows>system32 Ordner im Labview verwenden, so dass das "normale" Windows Login Fenster verwendet werden kann.
Ich habe es auch schon hinbekommen in C# den windows Login Dialog aufzurufen und aus dem Aufruf eine DLL zu bauen, die ich via .Net aufrufen kann. Es muss doch aber möglich sein, dies weniger umständlich mit Labview Boardmitteln zu machen. Aber irgendwie komme ich in Labview mit den Datentypen (komplexe Pointer usw.) der Credui.dll Funktionen nicht klar.
Die Funktion in der DLL, mit der man das Login Fenster aufrufen kann ist:
CredUIPromptForWindowsCredentialsW
der Prototyp der Funktion sieht wie folgt aus:
DWORD WINAPI CredUIPromptForWindowsCredentials(
_In_opt_ PCREDUI_INFO pUiInfo,
_In_ DWORD dwAuthError,
_Inout_ ULONG *pulAuthPackage,
_In_opt_ LPCVOID pvInAuthBuffer,
_In_ ULONG ulInAuthBufferSize,
_Out_ LPVOID *ppvOutAuthBuffer,
_Out_ ULONG *pulOutAuthBufferSize,
_Inout_opt_ BOOL *pfSave,
_In_ DWORD dwFlags
);
Vielleicht kann mir jemand weiterhelfen...
Danke schon mal im vorraus zu allem "sachdienlichen"
Dieses API ist recht komplex. Googling scheint anzugeben dass die ANSI Version dieses APIs immer nur einen Fehler zurückgibt. Also müsste man die Unicode Version aufrufen was erfordert dass man alle Strings von LabVIEW ANSI nach Unicode und danach wieder zurück wandeln muss.
Das wird alles ziemlich schnell ziemlich kompliziert. Da Du die .Net Implementation bereits hast, solltest Du das Prinzip ja kennen, denn was Du da mit PInvoke machen musst um dieses API (und anverwandte APIs) aufzurufen ist grundsätzlich dasselbe was man in LabVIEW mit der Call Library Node macht.
Du musst Unicode Buffer anlegen und initialisieren und korrekt in die PCREDUI_INFO structure zuweisen. Dazu alles auch für die Parameter, wobei Du aufpassen musst das für die _Out_ Buffers entsprechend viel uInt16 Elemente bereitstellst. Für die Pointer Parameter kann man direkt entsprechende Datetypen verwenden, aber für die Pointer innerhalb der Struct wird es schwieriger. Das sind nämlich 32 Bit Integer in 32 Bit LabVIEW und 64 Bit Integer in 64 Bit LabVIEW und da gibt es keinerlei automatische Möglichkeit um LabVIEW das machen zu lassen und daher muss man mittels Conditional Compile diese Dinge explicit programmieren.
Grundsätzlich alles nicht wirklich schwieriger dann PInvoke in .Net aber halt schon ziemlich viel Arbeit.