Breng een aftasten van de hardwareopsporing van Delphi, InstallShield, C++, manuscript teweeg of stel herinnering in werking
In mijn plaatsingsproces, had het als ik ging sommige veranderingen in hardware moeten ontdekken en dan reboot uitvoeren gekeken.
Ik onderzocht hoe te om dit te doen maar het draait ou dat ik deze code niet nodig heb. In het hol gaat het.
U kunt de tovenaar „manueel toevoegt van de Nieuwe Hardware“ natuurlijk in werking stellen. Hier is de te doen bevellijn enkel dat:
„C:\WINDOWS\system32\rundll32.exe“ C:\WINDOWS\system32\shell32.dll, Control_RunDLL „C:\WINDOWS\system32\hdwwiz.cpl“, ontdekt Hardware
Nochtans, wat als u het proces wilt automatiseren.
De informatie voor hoe te om dit te doen is vrij schaars alhoewel er een technetpagina over het is. Vreemd genoeg het eerste ding dat ik was een manuscript NSIS voor het doen van dit door dat open broninstalationprogramma heb gevonden. Het vreemde ding over het is dat het op een website was WinAMP (verbinding).
Hier is die code:
-
Functie ScanForNewHW
-
SetPluginUnload alwaysoff
-
StrCpy $1 „“
-
Â
-
Systeem:: Setupapi van de vraag ':: CM_Locate_DevNodeA (*i .r0, t r1, I r2) I .r3 ′
-
Systeem:: Setupapi van de vraag ':: CM_Reenumerate_DevNode (I r0, I r4) I .r5 ′
-
Â
-
Het handboek van SetPluginUnload
-
Systeem:: Vrije 0
-
FunctionEnd
Bewapend met de naam DLL, het tweede ding dat ik was een Install manuscript heb gevonden van het Schild (verbinding) dat toeliet het om worden gedaan:
-
functie ScanForHardwareChanges ()
-
 AANTAL devInst, myreturn;
-
begin
-
 als (UseDLL (WINSYSDIR ^ „cfgmgr32.dll“)! = 0) toen
-
  MessageBox („laadde geen Dll“, STRENG);
-
  VALSE terugkeer;
-
 endif;
-
 myreturn = CM_Locate_DevNodeA (&devInst, „\ 0 „, 0);
-
 myreturn = CM_Reenumerate_DevNode (devInst, 0);
-
 UnUseDLL (WINSYSDIR ^ „cfgmgr32.dll“);
-
 WARE terugkeer;
-
eind;
Bewapend met de naam DLL en een mogelijke procedurenaam, kon ik de de steunpagina van Microsoft over het (verbinding) opsporen. Die pagina verstrekte a.c. routine voor het roepen van de code. Hier is het:
-
BOOL ScanForHardwareChanges ()
-
{
-
  DEVINST   devInst;
-
  CONFIGRET  status;
-
 Â
-
  //
-
  // krijgt de wortel devnode.
-
  //
-
 Â
-
  status = CM_Locate_DevNode (&devInst, ONGELDIG, CM_LOCATE_DEVNODE_NORMAL);
-
 Â
-
  als (status! = CR_SUCCESS) {
-
    VALSE terugkeer;
-
Â
-
  }
-
 Â
-
  status = CM_Reenumerate_DevNode (devInst, 0);
-
 Â
-
  als (status! = CR_SUCCESS) {
-
    VALSE terugkeer;
-
  }
-
Â
-
  WARE terugkeer;
-
}
Nochtans, wilde ik dit in Delphi doen. Met de correcte constante namen, kon ik twee verwijzingen naar deze routine vinden. Het van Delphi Jedi- project heeft a verstrekt een routine voor het laden van DLL die deze vraag om toelaat worden gemaakt en of iemand (verbinding) de code van Microsoft in een routine voor aftasten voor de hardware vertaalde of er was gegaane a, nu, Jedi- manifestatieproject dat deze routine omvatte. Één van beide manier, de Franse plaats was eerste één ik dat voor nieuwe hardware met Delphi afgetast had gevonden.
Hier is die code:
-
procedure SomeProcedure;
-
 // eerst u de module moet laden.Â
-
 LoadConfigManagerApi;Â
-
 // roept dan een vertaling van de routine van lidstaten
-
 ScanForHardwareChanges;
-
eind;
-
Â
-
// is hier de vertaling van ScanForHardwareChanges
-
functie ScanForHardwareChanges: van Boole;
-
var
-
 dev: DEVINST;
-
 status: CONFIGRET;
-
begin
-
Â
-
 status: = CM_Locate_DevNode (dev,“, CM_LOCATE_DEVNODE_NORMAL);
-
Â
-
 als (status <> CR_SUCCESS) toen
-
 begin
-
  resultaat: = VALS;
-
  uitgang;
-
 eind;
-
Â
-
 status: = CM_Reenumerate_DevNode (dev, 0);
-
Â
-
 als (status <> CR_SUCCESS) toen
-
 begin
-
  resultaat: = VALS;
-
  uitgang;
-
 eind;
-
 Resultaat: = WAAR;
-
eind;
Die routine werd opgenomen op een Russische plaats (verbinding) en werd gewijzigd onafhankelijk om van de Jedi- dossiers te zijn. Nochtans, omvatten beide routines manier meer informatie dan nodig is.
Het proces is werkelijk eenvoudig.
1. Laad DLL
2. Krijg de plaats van de twee methodes u wenst.
3. Oproepen hen (gebruikend de aangewezen constanten
4. Maak alles leeg.
Ik heb mijn eigen routine geschreven van Delphi die dat alles doet en geen extra gesleepte bagage (drug?) heeft langs voor de rit.
Mijn alle-in-één oplossing:
-
{******************************************************************************
-
 ScanForHardwareChanges
-
 door Brian Layman in TheCodeCave.com
-
******************************************************************************}
-
functie ScanForHardwareChanges: Van Boole;
-
const
-
 CFGMGR32_DLL         = `cfgmgr32.dll';
-
 CM_LOCATE_DEVNODE_NAME    = `CM_Locate_DevNodeA';
-
 CM_REENUMERATE_DEVNODE_NAME = `CM_Reenumerate_DevNode';
-
 CM_LOCATE_DEVNODE_NORMAL   = $00000000;
-
 CR_SUCCESS          = $00000000;
-
var
-
  DeviceNode: DWord;
-
  HCfgMgr: T-hendel;
-
  CM_Locate_DevNode: functie (var dnDevInst: DWord; pDeviceID: PAnsiChar;
-
                ulFlags: ULONG): DWord; stdcall;
-
  CM_Reenumerate_DevNode: functie (dnDevInst: DWord; ulFlags: ULong): DWord; stdcall;
-
begin met // ScanForHardwareChanges
-
 Resultaat: = VALS;
-
 HCfgMgr: = LoadLibrary (CFGMGR32_DLL);
-
 als (HCfgMgr <32)
-
 dan MessageDlg (Fout `: kon geen mtError van de Manager DLL', van de Configuratie, [mbOk], 0) vinden
-
 anders begin
-
  probeer
-
   CM_Locate_DevNode: = GetProcAddress (HCfgMgr, CM_LOCATE_DEVNODE_NAME);
-
   CM_Reenumerate_DevNode: = GetProcAddress (HCfgMgr, CM_REENUMERATE_DEVNODE_NAME);
-
   als (CM_Locate_DevNode (DeviceNode, NUL, CM_LOCATE_DEVNODE_NORMAL) = CR_SUCCESS)
-
   dan Resultaat: = (CM_Reenumerate_DevNode (DeviceNode, 0) = CR_SUCCESS);
-
  tot slot // omslag omhoog
-
   FreeLibrary (HCfgMgr);
-
  eind;  // probeert/tenslotte
-
 eind;
-
eind;Â // ScanForHardwareChanges
Als bonus, hier wordt het gecombineerd in een project dat aftasten voor nieuwe hardware en reboot dan de computer.
(meer…)
















