在我的Delphi应用程序中,我想使用Microsoft Windows网络列表管理器API(NLM)了解网络更改:http://msdn.microsoft.com/library/ee264321
我查看了链接的"如何注册NLM事件"示例并将其翻译为Delphi.但是,我不知道如何继续这样做.
var
pNLM: INetworkListManager;
pCpc: IConnectionPointContainer;
pConnectionPoint: IConnectionPoint;
pSink: IUnknown;
dwCookie: LongInt;
const
IID_IConnectionPointContainer: TGUID = '{B196B284-BAB4-101A-B69C-00AA00341D07}';
IID_IUnknown: TGUID = '{00000000-0000-0000-C000-000000000046}';
begin
if Succeeded(CoCreateInstance(CLASS_NetworkListManager, nil, CLSCTX_ALL, IID_INetworkListManager, pNLM)) then
begin
if Succeeded(pNLM.QueryInterface(IID_IConnectionPointContainer, pCpc)) then
begin
if Succeeded(pCpc.FindConnectionPoint(IID_INetworkEvents, pConnectionPoint)) then
begin
if Succeeded(pCpc.QueryInterface(IID_IUnknown, pSink)) then
begin
pConnectionPoint.Advise(pSink, dwCookie);
end;
end;
end;
end;
end;
Run Code Online (Sandbox Code Playgroud)
文章sais:
"您已创建的INetworkListManager对象后以上你会从该点向前接收INetworkEvents通知.pSink实现INetworkEvent接口包括那些事件处理方法,例如NetworkAdded,NetworkDeleted,NetworkConnectivityChanged,和NetworkPropertyChanged".
不幸的是我不知道该怎么做.没有进一步的说明,所以我希望这里有人可以指导我/提供一个示例,为这些事件调用自定义程序.谢谢.
您正在传递错误的对象Advise().你正在传递这个IConnectionPointContainer对象.您需要编写自己的实现INetworkEvents接口的类,然后创建类的实例并将该对象传递给Advise().这就是NLM(或使用连接点的任何其他COM对象)能够将事件发送到您的代码的方式.
更新:您需要更改NLMEvents单位以在StartNLMEventListener()退出后使NLM对象保持活动状态,然后事件才能正常工作.你对它进行编码的方式,NLM对象是本地的StartNLMEventListener(),因此在StartNLMEventListener()退出时被释放,这会取消注册你的事件接收器.
试试这个:
unit NLMEvents;
interface
function StartNLMEventListener: HResult;
function StopNLMEventListener: HResult;
implementation
uses
Windows, ActiveX, NETWORKLIST_TLB, SysUtils, Unit1;
type
TMyNetworkEvents = class(TInterfacedObject, INetworkEvents, INetworkConnectionEvents, INetworkListManagerEvents)
public
function NetworkAdded(networkId: TGUID): HResult; stdcall;
function NetworkConnectivityChanged(networkId: TGUID; NewConnectivity: NLM_CONNECTIVITY): HResult; stdcall;
function NetworkDeleted(networkId: TGUID): HResult; stdcall;
function NetworkPropertyChanged(networkId: TGUID; fFlags: NLM_NETWORK_PROPERTY_CHANGE): HResult; stdcall;
function ConnectivityChanged(NewConnectivity: NLM_CONNECTIVITY): HResult; stdcall;
function NetworkConnectionConnectivityChanged(networkId: TGUID; NewConnectivity: NLM_CONNECTIVITY): HResult; stdcall;
function NetworkConnectionPropertyChanged(networkId: TGUID; fFlags: NLM_NETWORK_PROPERTY_CHANGE): HResult; stdcall;
end;
var
pNLM: INetworkListManager = nil;
dwCookie1: LongInt = -1;
dwCookie2: LongInt = -1;
dwCookie3: LongInt = -1;
const
IID_IConnectionPointContainer: TGUID = '{B196B284-BAB4-101A-B69C-00AA00341D07}';
//IID_IUnknown: TGUID = '{00000000-0000-0000-C000-000000000046}';
//CLSID_NetworkListManager: TGUID = '{DCB00C01-570F-4A9B-8D69-199FDBA5723B}';
function TMyNetworkEvents.ConnectivityChanged(NewConnectivity: NLM_CONNECTIVITY): HResult; stdcall;
begin
Form2.Memo1.Lines.Add('ConnectivityChanged');
Result := S_OK;
end;
function TMyNetworkEvents.NetworkConnectionConnectivityChanged(networkId: TGUID; NewConnectivity: NLM_CONNECTIVITY): HResult; stdcall;
begin
Form2.Memo1.Lines.Add('NetworkConnectionConnectivityChanged');
Result := S_OK;
end;
function TMyNetworkEvents.NetworkConnectionPropertyChanged(networkId: TGUID; fFlags: NLM_NETWORK_PROPERTY_CHANGE): HResult; stdcall;
begin
Form2.Memo1.Lines.Add('NetworkConnectionPropertyChange');
Result := S_OK;
end;
function TMyNetworkEvents.NetworkAdded(networkId: TGUID): HResult; stdcall;
begin
Form2.Memo1.Lines.Add('NetworkAdded');
Result := S_OK;
end;
function TMyNetworkEvents.NetworkConnectivityChanged(networkId: TGUID; NewConnectivity: NLM_CONNECTIVITY): HResult; stdcall;
begin
Form2.Memo1.Lines.Add('NetworkConnectivityChanged');
Result := S_OK;
end;
function TMyNetworkEvents.NetworkDeleted(networkId: TGUID): HResult; stdcall;
begin
Form2.Memo1.Lines.Add('NetworkDeleted');
Result := S_OK;
end;
function TMyNetworkEvents.NetworkPropertyChanged(networkId: TGUID; fFlags: NLM_NETWORK_PROPERTY_CHANGE): HResult; stdcall;
begin
Form2.Memo1.Lines.Add('NetworkPropertyChanged');
Result := S_OK;
end;
function StartNLMEventListener: HResult;
var
pCpc: IConnectionPointContainer;
pConnectionPoint: IConnectionPoint;
pSink: INetworkEvents;
begin
if pNLM = nil then
begin
Result := CoCreateInstance(CLASS_NetworkListManager, nil, CLSCTX_ALL, IID_INetworkListManager, pNLM);
if Failed(Result) then
Exit;
end else
begin
Result := S_OK;
end;
if Succeeded(pNLM.QueryInterface(IID_IConnectionPointContainer, pCpc)) then
begin
pSink := TMyNetworkEvents.Create as INetworkEvents;
if dwCookie1 = -1 then
begin
if Succeeded(pCpc.FindConnectionPoint(IID_INetworkEvents, pConnectionPoint)) then
begin
pConnectionPoint.Advise(pSink, dwCookie1);
pConnectionPoint := nil;
end;
end;
if dwCookie2 = -1 then
begin
if Succeeded(pCpc.FindConnectionPoint(IID_INetworkConnectionEvents, pConnectionPoint)) then
begin
pConnectionPoint.Advise(pSink, dwCookie2);
pConnectionPoint := nil;
end;
end;
if dwCookie3 = -1 then
begin
if Succeeded(pCpc.FindConnectionPoint(IID_INetworkListManagerEvents, pConnectionPoint)) then
begin
pConnectionPoint.Advise(pSink, dwCookie3);
pConnectionPoint := nil;
end;
end;
end;
end;
function StopNLMEventListener: HResult;
var
pCpc: IConnectionPointContainer;
pConnectionPoint: IConnectionPoint;
begin
if pNLM <> nil then
begin
if Succeeded(pNLM.QueryInterface(IID_IConnectionPointContainer, pCpc)) then
begin
if dwCookie1 <> -1 then
begin
if Succeeded(pCpc.FindConnectionPoint(IID_INetworkEvents, pConnectionPoint)) then
begin
pConnectionPoint.Unadvise(dwCookie1);
pConnectionPoint := nil;
end;
end;
if dwCookie2 <> -1 then
begin
if Succeeded(pCpc.FindConnectionPoint(IID_INetworkConnectionEvents, pConnectionPoint)) then
begin
pConnectionPoint.Unadvise(dwCookie2);
pConnectionPoint := nil;
end;
end;
if dwCookie3 <> -1 then
begin
if Succeeded(pCpc.FindConnectionPoint(IID_INetworkListManagerEvents, pConnectionPoint)) then
begin
pConnectionPoint.Unadvise(dwCookie3);
pConnectionPoint := nil;
end;
end;
end;
pNLM := nil;
end;
dwCookie1 := -1;
dwCookie2 := -1;
dwCookie3 := -1;
Result := S_OK;
end;
end.
Run Code Online (Sandbox Code Playgroud)