Seite 1 von 1
Verwenden der newdev.dll
Verfasst: 17.07.2014 23:00
von The_Dark_Zim-.-
Hey ho,
ich versuche gerade einen Treiber mithilfe der newdev.dll zu installieren. Leider bekomme ich beim versuch die Funktion "UpdateDriverForPlugAndPlayDevicesA" bzw. "UpdateDriverForPlugAndPlayDevicesW" auf zu rufen eine Fehlermeldung "Ungültiger Speicherzugriff".
Da ich nicht so oft mit DLL's arbeite dachte ich mir frag ich mal lieber nach ^^
Code: Alles auswählen
hwnd = 0
hardwareid$ = "USB\VID_0000&PID_0400"
path$ = "C:\Documents And Settings\Administrator\My Documents\Dropbox\HTK\USB\"
flag = 0
reboot = 0
Procedure.s GetSpecialFolder(iCSIDL.i)
Protected sPath.s = Space(#MAX_PATH)
If SHGetSpecialFolderPath_(#Null, @sPath, iCSIDL, 0) = #True
ProcedureReturn sPath
Else
ProcedureReturn ""
EndIf
EndProcedure
system32$ = GetSpecialFolder(#CSIDL_SYSTEM) + "\newdev.dll"
OpenLibrary(0, system32$)
Debug CallCFunction(0, "UpdateDriverForPlugAndPlayDevicesA", hwnd, @hardwareid$, @path$, flag, reboot)
CloseLibrary(0)
Merkwürdigerweise finde ich auch nur sehr wenig zu "UpdateDriverForPlugAndPlayDevicesA" bzw. "UpdateDriverForPlugAndPlayDevicesW". Bei MSDN ist immer nur die Rede von "UpdateDriverForPlugAndPlayDevices".
Re: Verwenden der newdev.dll
Verfasst: 17.07.2014 23:18
von NicTheQuick
Soweit ich weiß ist die Funktion mit A am Ende die Ascii-Version und die mit W am Ende die Unicode-Version. Vielleicht solltest du es mal mit einem Prototype versuchen. Das ist eh die bessere Version.
Re: Verwenden der newdev.dll
Verfasst: 18.07.2014 00:38
von edel
Tausch mal CallCFunction gegen CallFunction aus.
Re: Verwenden der newdev.dll
Verfasst: 18.07.2014 07:58
von Chimorin
Eventuell kann es auch an trivialen Dingen scheitern.
Welcher Version gehört die DLL an (x64/x86); Wie kompillierst du dein Programm?
Für x64-Programme brauchst du x64 DLLs (x86 geht wohl nicht nach eigener Erfahrung, finde ich aber merkwürdig)
Für x86 eben x86.
Re: Verwenden der newdev.dll
Verfasst: 18.07.2014 11:49
von ts-soft
Erstmal: Programm muß nativer DLL-Auslösung entsprechen, also 64-Bit OS = 64-Bit Programm, andernfalls
geht es ja nur in 32-Bit!
Die Funktion gibt es in Unicode oder Ansi (A oder W am ende des Namens, wir nehmen Unicode per Pseudocode).
Hier der Code, wobei ich voraussetze, das die Parameter korrekt sind:
Code: Alles auswählen
EnableExplicit
Prototype UpdateDriverForPlugAndPlayDevices(hWnd, hardwareid.p-unicode, path.p-unicode, flag, reboot)
Define hWnd = 0
Define hardwareid.s = "USB\VID_0000&PID_0400"
Define path.s = "C:\Documents And Setting\Administrator\My Documents\Dropbox\HTK\USB\"
Define flag = 0, reboot = 0
Define DLL, UpdateDriverForPlugAndPlayDevices.UpdateDriverForPlugAndPlayDevices
DLL = OpenLibrary(#PB_Any, "newdev.dll")
If DLL
Debug DLL
UpdateDriverForPlugAndPlayDevices = GetFunction(DLL, "UpdateDriverForPlugAndPlayDevicesW")
Debug UpdateDriverForPlugAndPlayDevices
If UpdateDriverForPlugAndPlayDevices
Debug UpdateDriverForPlugAndPlayDevices(hWnd, hardwareid, path, flag, reboot)
EndIf
CloseLibrary(DLL)
EndIf
Re: Verwenden der newdev.dll
Verfasst: 25.07.2014 18:58
von The_Dark_Zim-.-
Hey ho,
ich bin heute endlich zum Testen gekommen
Ich habe jetzt folgenden Code der so funktioniert (getestet unter XP(32/64)
Code: Alles auswählen
EnableExplicit
Prototype UpdateDriverForPlugAndPlayDevices(hWnd, hardwareid.p-unicode, path.p-unicode, flag, reboot)
Define hWnd = 0
Define hardwareid.s = "USB\VID_0000&PID_0400&Rev_0100"
Define path.s = "C:\USB\VCPDriver.inf"
Define flag = 0, reboot = 0
Define lasterror = 0
Define error$ = ""
Define DLL, UpdateDriverForPlugAndPlayDevices.UpdateDriverForPlugAndPlayDevices
DLL = OpenLibrary(#PB_Any, "newdev.dll")
If DLL
Debug DLL
UpdateDriverForPlugAndPlayDevices = GetFunction(DLL, "UpdateDriverForPlugAndPlayDevicesW")
Debug UpdateDriverForPlugAndPlayDevices
If UpdateDriverForPlugAndPlayDevices
If UpdateDriverForPlugAndPlayDevices(hWnd, hardwareid, path, flag, reboot) = 0
lasterror = GetLastError_()
Select lasterror
Case #ERROR_FILE_NOT_FOUND
error$ = "ERROR_FILE_NOT_FOUND"
; Case #ERROR_IN_WOW64 ; Scheinbar nicht implementiert
; Debug "ERROR_IN_WOW64"
Case #ERROR_INVALID_FLAGS
error$ = "ERROR_INVALID_FLAGS"
Case 3758096907
error$ = "ERROR_NO_SUCH_DEVINST"
Case #ERROR_NO_MORE_ITEMS
error$ = "ERROR_NO_MORE_ITEMS"
Default
error$ = Str(lasterror)
EndSelect
MessageRequester("Treiber", "Fehlercode: " + error$)
Else
MessageRequester("Treiber", "Treiber wurde erfolgreich installiert!")
EndIf
EndIf
CloseLibrary(DLL)
EndIf
Wenn man XP x64 benutzt muss man mit PB x64 Compilieren
Ich Danke für eure Hilfe
Gruß Zim
Re: Verwenden der newdev.dll
Verfasst: 26.07.2014 16:51
von Chimorin
The_Dark_Zim-.- hat geschrieben:
Wenn man XP x64 benutzt muss man mit PB x64 Compilieren
Da hast du etwas falsch verstanden. Du kannst unter Win x64 x64- und x86-Programme ausführen.
Unter Win x86 nur 32-bit Programme.
Du
musst allerdings die passende DLL-Version für dein Programm haben.
Windows ist da in erster Linie egal.
Re: Verwenden der newdev.dll
Verfasst: 26.07.2014 17:44
von ts-soft
@Chimorin
Das gilt aber nicht für Treiber-DLLs!
Re: Verwenden der newdev.dll
Verfasst: 26.07.2014 19:23
von _JON_
@Chimorin
Er hat nichts falsch verstanden. Die Funktion UpdateDriverForPlugAndPlayDevices() muss von einem nativen Programm aufgerufen werden.
Sonst bekommt man den Error: ERROR_IN_WOW64
"The calling application is a 32-bit application attempting to execute in a 64-bit environment, which is not allowed."
Re: Verwenden der newdev.dll
Verfasst: 27.07.2014 23:26
von The_Dark_Zim-.-
Hey Ho,
mit dem Compilieren in der richtigen Version hatte ich geschrieben, da ich, als ich mit der x86 Version compiliert hatte, einen Fehler code ~ -5XXXXXX bekommen hatte.
Mit der x64 Version ging es dann.
Ich habe das Ganze heute außerdem noch mit Win7 32bit testen können, wo es auch Funktioniert

. Man muss die Exe allerdings mit Adminrechten ausführt, sonst bekommt man den Fehlercode 5
