【问题标题】:How can i make a program to update plug and play devices (Windows 8)如何制作程序来更新即插即用设备(Windows 8)
【发布时间】:2015-09-10 17:25:42
【问题描述】:

...比如转到设备管理器,右键单击,然后更新。

我试着在delphi上做程序,像这样。

unit Unit1;

interface

uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,   Dialogs, StdCtrls,mmsystem;

type  
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);   
    private
    public
    end;

var   Form1: TForm1;

implementation

{$R *.dfm} const  DBT_CONFIGCHANGED = $0018;

procedure TForm1.FormCreate(Sender: TObject); begin
  SendMessage(HWND_BROADCAST, WM_DEVICECHANGE, DBT_CONFIGCHANGED, 0);
end;

但它不起作用。

【问题讨论】:

  • 不是 Delphi,但也许这有帮助 ftdichip.com/Support/Documents/AppNotes/…
  • 如果你说发生了什么而不是简单地说它不起作用,你更有可能得到一个好的答案。它是抛出一个错误(错误是什么),让你的电脑爆炸,把火星变成一个黑洞,还是别的什么?见How to create a Minimal, Complete, and Verifiable example
  • 当我启动这个程序时。什么都没有改变,我只听到像某些设备被移除的歌曲。设备不是更新。 srart 后我的窗户看不到我的笔记本电脑电池的所有问题,当我在潜水管理器中更新我的设备时,我的电池是站立的。如果我在这里分享我的delhpi progect会更好吗?
  • 此代码执行您期望的操作的文档在哪里?我以为系统会广播这些消息。我不明白你为什么相信你可以这样做。
  • 不要无缘无故地尝试随机代码。你需要找到一些文档。更重要的是,为什么你的程序甚至需要这样做?在我看来,这对于您实际面临的任何问题都是错误的解决方案。

标签: api delphi


【解决方案1】:

根据this微软的文章,您可以使用以下代码强制从应用程序重新枚举设备树:

const
  CM_LOCATE_DEVNODE_NORMAL = 0;
  CR_SUCCESS = 0;

type
  DEVINST = LongWord;
  CONFIGRET = LongWord;
  ULONG = LongWord;

function CM_Locate_DevNode(var dnDevInst: DEVINST; pDeviceID: Pointer; ulFlags: ULONG): CONFIGRET; stdcall; external 'cfgmgr32.dll' name 'CM_Locate_DevNodeA';
function CM_Reenumerate_DevNode(var dnDevInst: DEVINST; ulFlags: ULONG): CONFIGRET; stdcall; external 'cfgmgr32.dll' name 'CM_Reenumerate_DevNode';

function ScanForHardwareChanges(): Boolean;
var
  dev: DEVINST;
  retval: CONFIGRET;
begin
  // Get the root devnode.
  retval := CM_Locate_DevNode(dev, nil, CM_LOCATE_DEVNODE_NORMAL);

  if (retval <> CR_SUCCESS) then
  begin
    // Writeln('CM_Locate_DevNode failed: ', status);
    Result := False;
    Exit;
  end;

  retval := CM_Reenumerate_DevNode(dev, 0);

  if (retval <> CR_SUCCESS) then
  begin
    // Writeln('CM_Reenumerate_DevNode failed: ', status);
    Result := False;
    Exit;
  end;

  Result := True;
end;

【讨论】:

  • 感谢您的代码。我根据它制作了程序。但是设备没有更新:(也许我犯了一些错误。再次感谢您提供此代码
【解决方案2】:

感谢您的代码。我根据它制作了程序。

`unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, mmsystem;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
const
  CM_LOCATE_DEVNODE_NORMAL = 0;
  CR_SUCCESS = 0;

type
  DEVINST = LongWord;
  CONFIGRET = LongWord;
  ULONG = LongWord;

function CM_Locate_DevNode(var dnDevInst: DEVINST; pDeviceID: Pointer; ulFlags: ULONG): CONFIGRET; stdcall; external 'cfgmgr32.dll' name 'CM_Locate_DevNodeA';
function CM_Reenumerate_DevNode(var dnDevInst: DEVINST; ulFlags: ULONG): CONFIGRET; stdcall; external 'cfgmgr32.dll' name 'CM_Reenumerate_DevNode';
procedure TForm1.Button1Click(Sender: TObject);

function ScanForHardwareChanges(): Boolean;
var
  dev: DEVINST;
  retval: CONFIGRET;
begin

begin
  // Get the root devnode.
  retval := CM_Locate_DevNode(dev, nil, CM_LOCATE_DEVNODE_NORMAL);

  if (retval <> CR_SUCCESS) then
  begin
    // Writeln('CM_Locate_DevNode failed: ', status);
    Result := False;
    Exit;
  end;

  retval := CM_Reenumerate_DevNode(dev, 0);

  if (retval <> CR_SUCCESS) then
  begin
    // Writeln('CM_Reenumerate_DevNode failed: ', status);
    Result := False;
    Exit;
  end;

  Result := True;
end;
end;
BEGIN
END;

end.`

但是设备没有更新:(也许我犯了一些错误。再次感谢您提供此代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-07
    • 2011-01-04
    • 2017-06-09
    • 1970-01-01
    • 2015-02-03
    相关资源
    最近更新 更多