ゴランでsyscall.GetLastError()
は最後のエラーを返しません。syscall GetLastError()はエラーを返しません
if handle := _OpenSCManager(machineNamePtr, databaseNamePtr, desiredAccess); handle == nil {
if err := syscall.GetLastError(); err != nil {
return InvalidServiceDatabaseHandleHandle, ServiceErrno(err.(syscall.Errno))
}
}
err
次の例を参照してください常にnil
です。 machineNamePtr
はexsiting以外のマシンであるとします。同じコードをC++でテストし、GetLastError()
がRPC server is not available
にスローされました。だからgo
にいないのはなぜですか?
EDIT
_OpenSCManagerはgo generate
で生成されます。 //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
}
これは、 '_OpenSCManager'の実装によって異なります。それは成功した場合にのみ 'handle'を返しますか?それでは、ここではエラーは発生しません。 – RickyA
btw。パッケージにプライベートなものが必要なときは、アンダースコアの代わりに小文字を使用して名前を開始します。 '_OpenSCManager'ではなく' openSCManager'を使用してください。 – RickyA
はい、 'handle'だけを返します。 [ここ](https://msdn.microsoft.com/de-de/library/windows/desktop/ms684323(v = vs.85).aspx)を参照してください。ネイティブのC++で最後のエラーが発生するので、これは 'go'に特化されています – maddin