In Golang syscall.GetLastError()
gibt den letzten Fehler nicht zurück. Siehe das folgende Beispielsyscall GetLastError() gibt keinen Fehler
if handle := _OpenSCManager(machineNamePtr, databaseNamePtr, desiredAccess); handle == nil {
if err := syscall.GetLastError(); err != nil {
return InvalidServiceDatabaseHandleHandle, ServiceErrno(err.(syscall.Errno))
}
}
err
ist immer nil
. Angenommen, machineNamePtr
ist eine nicht existierende Maschine. Getestet den gleichen Code mit C++ und GetLastError()
wirft RPC server is not available
. Also warum nicht auf go
?
EDIT
_OpenSCManager mit go generate
erzeugt. //sys _OpenSCManager(machineName *uint16, databaseName *uint16, desiredAcces ServiceAccessRight) (handle ServiceDatabaseHandle) = advapi32.OpenSCManagerW
func _OpenSCManager(machineName *uint16, databaseName *uint16, desiredAcces ServiceAccessRight) (handle ServiceDatabaseHandle) {
r0, _, _ := syscall.Syscall(procOpenSCManagerW.Addr(), 3, uintptr(unsafe.Pointer(machineName)), uintptr(unsafe.Pointer(databaseName)), uintptr(desiredAcces))
handle = ServiceDatabaseHandle(r0)
return
}
Es hängt von Ihrer Implementierung von _OpenSCManager ab. Gibt es nur einen 'Griff' zurück, wenn es erfolgreich ist? Dann wirst du hier nie einen Fehler bekommen. – RickyA
übrigens. Wenn Sie etwas Privates für das Paket wünschen, starten Sie den Namen mit einem Kleinbuchstaben anstelle eines Unterstrichs. 'openSCManager' anstelle von' _OpenSCManager'. – RickyA
Ja, es gibt nur einen 'Handle' zurück. Siehe [hier] (https://msdn.microsoft.com/de-de/library/windows/desktop/ms684323 (v = vs.85) .aspx). Ist das 'gehen' spezifisch, weil auf nativem C++ bekomme ich den letzten Fehler – maddin