I'd guess that the construction of a Pointer with the return value
(which causes object allocation) is causing the GetLastError value to
be overwritten.
Try changing the return type to void to see if it makes a difference
(I know that's not useful in actual usage, but it'll help determine
if it's the allocation of the return value which clears the error).
T.
On Aug 8, 2007, at 8:16 AM, Thomas Börkel wrote:
HI!
I am too struggling with GetLastError().
I am not using the Kernel32 class from the examples, but my own. I
tried
to define the return type as NativeLong and as int with no
difference. I
always get 0 from GetLastError(), where I get for example "5" in C.
Relevant bits:
Java:
Pointer handle;
handle = getServiceHandle("localhost", WINNT.GENERIC_EXECUTE);
public static Pointer getServiceHandle(String machine, long access)
throws Exception {
Pointer handle;
Advapi32 advapi32;
WString machineW;
NativeLong accessNL;
int lastError;
advapi32 = Advapi32.INSTANCE;
machineW = new WString(machine);
accessNL = new NativeLong(access);
Kernel32.INSTANCE.GetLastError();
handle = advapi32.OpenSCManagerW(machineW, null, accessNL);
lastError = Kernel32.INSTANCE.GetLastError();
if(handle == null) {
throw new Exception("Win32 error: " + lastError);
}
return(handle);
}
C:
printf("%ld\n", OpenSCManagerW(L"localhost", NULL,
GENERIC_EXECUTE));
printf("%ld\n", GetLastError());