Discussione:
ERROR_INVALID_HANDLE solo in dll non in exe
(troppo vecchio per rispondere)
tets
2016-04-09 14:10:55 UTC
Permalink
Il codice qui sotto mi funziona perfettamente se lo compilo come exe.
Se invece lo compilo come dll SetupDiEnumDeviceInfo mi da un Error 6
ERROR_INVALID_HANDLE.
Mi sapete suggerire qualcosa da indagare per trovarne il motivo?

BOOL DisableInterface() {
DWORD i;
HDEVINFO hDevInfo;
SP_DEVINFO_DATA spDevInfoData ;
hDevInfo=(HDEVINFO) SetupDiGetClassDevsW(NULL, NULL, NULL,
DIGCF_ALLCLASSES | DIGCF_PRESENT);
if(hDevInfo == INVALID_HANDLE_VALUE){
if(dbg) wprintf(L"error");
return FALSE;
}
spDevInfoData.cbSize=sizeof(SP_DEVINFO_DATA);
SetupDiEnumDeviceInfo(hDevInfo, 0, &spDevInfoData);
wprintf(L"Error: %d", GetLastError());
i=GetLastError();
if(i == 0) {
MessageBoxW(NULL, L"WORK!", L"OK", MB_OK);
}else{
MessageBoxW(NULL, L"FAIL!", L"KO", MB_OK);
}
return i;
}
enoquick
2016-04-09 14:51:10 UTC
Permalink
Post by tets
Il codice qui sotto mi funziona perfettamente se lo compilo come exe.
Se invece lo compilo come dll SetupDiEnumDeviceInfo mi da un Error 6
ERROR_INVALID_HANDLE.
Mi sapete suggerire qualcosa da indagare per trovarne il motivo?
BOOL DisableInterface() {
DWORD i;
HDEVINFO hDevInfo;
SP_DEVINFO_DATA spDevInfoData ;
hDevInfo=(HDEVINFO) SetupDiGetClassDevsW(NULL, NULL, NULL,
DIGCF_ALLCLASSES | DIGCF_PRESENT);
if(hDevInfo == INVALID_HANDLE_VALUE){
if(dbg) wprintf(L"error");
return FALSE;
}
spDevInfoData.cbSize=sizeof(SP_DEVINFO_DATA);
SetupDiEnumDeviceInfo(hDevInfo, 0, &spDevInfoData);
wprintf(L"Error: %d", GetLastError());
i=GetLastError();
if(i == 0) {
MessageBoxW(NULL, L"WORK!", L"OK", MB_OK);
}else{
MessageBoxW(NULL, L"FAIL!", L"KO", MB_OK);
}
return i;
}
SetupDiEnumDeviceInfo ritorna un bool
prima devi testare il bool poi vedi GetLastError()
Non so se la causa e' questa,ma comunque questo e' un errore.
tets
2016-04-09 15:45:49 UTC
Permalink
Post by enoquick
SetupDiEnumDeviceInfo ritorna un bool
prima devi testare il bool poi vedi GetLastError()
Non so se la causa e' questa,ma comunque questo e' un errore.
il problema non è quello il GetLastError() è sincronizzato col bool di
return:

BOOL ret=SetupDiEnumDeviceInfo(hDevInfo, 0, &spDevInfoData);
i=GetLastError();
wprintf(L"Error: %d %d", i, ret);
if(ret==1 && i == 0) {
...
enoquick
2016-04-11 04:33:43 UTC
Permalink
Post by tets
Post by enoquick
SetupDiEnumDeviceInfo ritorna un bool
prima devi testare il bool poi vedi GetLastError()
Non so se la causa e' questa,ma comunque questo e' un errore.
il problema non è quello il GetLastError() è sincronizzato col bool di
BOOL ret=SetupDiEnumDeviceInfo(hDevInfo, 0, &spDevInfoData);
i=GetLastError();
wprintf(L"Error: %d %d", i, ret);
if(ret==1 && i == 0) {
...
No,GetLasterror() lo devi usare solo se ret e' false (che significa errore)
tets
2016-04-09 17:09:18 UTC
Permalink
Ho controllato meglio.
In effetti funziona anche da dll chiamata da un exe C.
Non funziona quando lo chiamo da autoit3:
Dim $a=dllCall("test.dll", "DWORD:cdecl", "hdstatus")
Continua a leggere su narkive:
Loading...