unmanaged DLL laden (Netapi32.dll)
-
Guten morgen zusammen!
Zur Zeit scheitere ich daran die Funktion
NetMessageBufferSend
aus der Netapi32.dll aufzurufen.
Ich bin dem Beispiel aus der MSDN gefolgt: http://msdn2.microsoft.com/en-us/library/2x8kf7zx(VS.80).aspxx// explicit DLLImport needed here to use P/Invoke marshalling because // System::String ^ is not the type of the first parameter to printf [DllImport("msvcrt.dll", EntryPoint = "printf", CallingConvention = CallingConvention::Cdecl, CharSet = CharSet::Ansi)] // or just // [DllImport("msvcrt.dll")] int printf(System::String ^, ...);
(beide Varianten lassen sich problemlos kompilieren)
Ich habe das PSDK installiert und auch in die Include-Pfade im VS 2005 Express eingetragen. Aber beim Aufruf der Funktion passiert gar nichts.
Was mach ich hier noch verkehrt? Oder gibt es evtl im Framework einen Ersatz (das wäre mir sogar lieber) für die Funtkion? :xmas2:
-
Wie schaut Deine deklaration für die DLL aus ?
Mit welchen Rückgabewert kommt NetMessageBufferSend zurück ?
-
Deklaration
[DllImport("netapi32.dll", EntryPoint = "NetMessageBufferSend", CallingConvention = CallingConvention::Cdecl, CharSet = CharSet::Ansi)] int NetMessageBufferSend (String^ servername, String^ msgname, String^ fromname, String^ buf, int buflen); //ein paar Zeilen darunter public ref class Form1 : ... //usw.
Bei der Deklaration habe ich mich an dem Beispiel aus der MSDN orientiert. Mit dem Rückgabewert (= 123) kann ich leider nichts anfangen.
-
Return Values
If the function succeeds, the return value is NERR_Success.If the function fails, the return value can be one of the following error codes.
Return code Description
ERROR_ACCESS_DENIED The user does not have access to the requested information.
ERROR_INVALID_PARAMETER The specified parameter is invalid.
ERROR_NOT_SUPPORTED This network request is not supported.
NERR_NameNotFound The user name could not be found.
NERR_NetworkError A general failure occurred in the network hardware.Wenn man nun in den dazu gehöhrenden Headern nach einer der oben angegebenen Fehler sucht, könnte es sein:
//
// MessageId: ERROR_INVALID_NAME
//
// MessageText:
//
// The filename, directory name, or volume label syntax is incorrect.
//
#define ERROR_INVALID_NAME 123L // dderrorEin NERR_ Fehler wird es nicht sein, die sind alle weit über 123;
#define NERR_BASE 2100
[...]
#define NERR_QNotFound (NERR_BASE+50) /* The printer does not exist. /
#define NERR_JobNotFound (NERR_BASE+51) / The print job does not exist. /
#define NERR_DestNotFound (NERR_BASE+52) / The printer destination cannot be found. */
[...]Ich kann Dir leider nicht beim eigentlichen Problem helfen, da ich in die Richtung (noch) nie entwickelt habe, aber vllt. bringt Dir der Ansatz etwas zur Fehlernummer zu finden etwas.
-
Danke für die Hilfe. Leider bringt mich das nicht weiter. Mein Programm läuft einfach durch. Ohne Fehler oder sonstiges. Auch im Debugger sehe ich nichts. Der Aufruf passiert und ich bekomme 123 als Rückgabe und das wars.
Google und die Groups bringen mich auch nicht weiter. Ich könnte den Aufruf zwar über Process::Start() aufrufen, aber ich möchte lieber diese Funktion nutzen. Schon aus Übungszwecken.
-
Kannst du die Funktion nicht direkt mit Header einbinden und ohne P/Invoke aufrufen?
-
Return Values
If the function succeeds, the return value is NERR_Success.Du hast einen Rückgabewert ungleich NERR_Success, ich weiß nicht was Du vom Debugger erwartest ? Der Rückgabewert liefert Dir die Information und mit der obrigen aufschlüsselung solltest Du weiterkommen können (musst halt mal ein wenig suchen).