我正在尝试在使用TNetSharingManager的Delphi 2010中编译此project。我已经导入了类型库并尝试编译它,但不幸的是我在这个函数中遇到了访问冲突:
function TNetSharingManager.GetDefaultInterface: INetSharingManager; begin if FIntf = nil then Connect; Assert(FIntf nil, 'DefaultInterface is NULL. Component is not connected to Server. You must call "Connect" or "ConnectTo" before this operation'); Result := FIntf; end;
(NETCONLib_TLB的一部分)
由于某些奇怪的原因,错误在:if FIntf = nil then
。
调用它的代码:
procedure TForm1.GetConnectionList(Strings,IdList: TStrings); var pEnum: IEnumVariant; vNetCon: OleVARIANT; dwRetrieved: Cardinal; pUser: NETCONLib_TLB.PUserType1; NetCon : INetConnection; begin Strings.Clear; IdList.Clear; pEnum := ( NetSharingManager.EnumEveryConnection._NewEnum as IEnumVariant); while (pEnum.Next(1, vNetCon, dwRetrieved) = S_OK) do begin (IUnknown(vNetCon) as INetConnection).GetProperties(pUser); NetCon := (IUnknown(vNetCon) as INetConnection); if (pUser.Status in [NCS_CONNECTED,NCS_CONNECTING])//remove if you want disabled NIC cards also and (pUser.MediaType in [NCM_LAN,NCM_SHAREDACCESSHOST_LAN,NCM_ISDN] ) and (GetMacAddress(GuidToString(pUser.guidId))'' ) then begin //we only want valid network cards that are enabled Strings.Add(pUser.pszwName ); IdList.Add(GuidToString(pUser.guidId)); end; end; end;
我不明白为什么我无法与 nil 进行比较。有什么想法吗?
答案 0 :(得分:2)
当触发该错误时,TNetSharingManager对象本身可能实际上已经死亡(或者首先没有创建)。 FIntF = nil 表达式是对类的实际字段的第一个引用,即它将指向无效的地址空间。
[编辑] 我下载源代码并按照步骤导入TLB(Delphi 2010)。为了执行appilcation,我不得不(a)以管理员身份运行Delphi,因为默认情况下我不是高级用户,并且(b)必须添加 pUser<>的检查。 nil 因为最终的getProperties返回一个nil-structure,但除此之外代码运行正常。所以不幸的是,我似乎无法重现你的问题。
重读您的问题,您是否在编译时获得了AV?