獲取本機所有IP和建立映射函數

//初始化套接字
function
TformMain.InitSocket(var AErr: string): Boolean; var AWD:TWSAData; begin Result := False; AErr:=''; Result:= WSAStartup(MakeWord(2,0),AWD)=0; if not Result then begin case WSAGetLastError of WSASYSNOTREADY : AErr:='基礎網絡通信未準備好.'; WSAVERNOTSUPPORTED : AErr:= '本系統Socket的版本不匹配.'; WSAEINPROGRESS : AErr:= 'Socket 1.1在此進程中被阻止.'; WSAEPROCLIM : AErr:= '已達到Windows套接字實現支持的任務限制.'; WSAEFAULT : AErr:= 'lpWSAData不是有效的指針.'; end; end; end;
//获取本机名称
function TformMain.GetLocalName: string;
var
  ABuf:array[0..255] of Char;
  AErr:string;
begin
   AErr:= '';
   if not InitSocket(AErr) then
   begin
     mmInfo.Lines.Add('初始化Socket失敗,原因:'+AErr);
     Exit;
   end;

   gethostname(ABuf,SizeOf(ABuf));
   Result := StrPas(ABuf);
   WSACleanup;
end;

  

//获取本机所有IP
function TformMain.GetIPsByPCName(APCName:string):TStrings;
type
  PIPArray=array[0..10] of PInAddr;
  PPIPArray = ^PIPArray;

var
  PPIP: PPIPArray;
  ABuffer:PAnsiChar;
  AEnt:PHostEnt;
  AErr:string;
  i:Integer;
begin
  Result := nil;

  if not InitSocket(AErr) then
  begin
    mmInfo.Lines.Add('Socket套接字初始化失敗,原因:'+AErr);
    Exit;
  end;
  AEnt := gethostbyname(PChar(APCName));
  if Assigned(AEnt) then
  begin
    Result := TStringList.Create;
    i:=0;
    PPIP:= PPIPArray(AEnt^.h_addr_list);
    while Assigned(PPIP^[i]) do
    begin
      Result.Add(StrPas(inet_ntoa(PPIP^[i]^)));
      Inc(i);
    end;
  end;
  WSACleanup;
end;

  

//建立网络映射
function TformMain.LinkToLabelServer(var AServer:string;var AErrMsg: string): Boolean;
var
  ANetRes:_NETRESOURCEA;
  AIPList:TStrings;
  AIP:string;
  i:Integer;
  isProductLan:Boolean;
  AUser,APwd:string;
  AIPFound : Boolean;
begin
  Result   := False;
  AErrMsg  := '';
  AServer  := '';
  AIPFound := False;
  AIPList := GetIPsByPCName(GetLocalName);
  if not Assigned(AIPList) then Exit;
  WNetCancelConnection2('',0,true);
  try
    for i:=0 to AIPList.Count-1 do
    begin
      AIP := AIPList.Strings[i];
      if LeftStr(AIP,6)='10.38.' then
      begin
        isProductLan := True;
        AIPFound := True;
        Break;
      end;
      if LeftStr(AIP,7)='10.132.' then
      begin
        isProductLan := False;
        AIPFound := True;
        Break;
      end;
    end;

    if not AIPFound then
    begin
      AErrMsg := '未獲取到本機的有效IP地址,請檢查網絡.';
      Exit;
    end; 
  finally
    AIPList.Free;
  end;  

  with QryTemp do
  begin
    Close;
    CommandText :=Format('SELECT PARAM_VALUE FROM SYS_BASE WHERE param_name=%s',[IfThen(isProductLan,QuotedStr('LABEL_PATH'),QuotedStr('LABEL_PATH_OA'))]);
    try
      Open;
      AIPList := TStringList.Create;
      try
        ExtractStrings(['@'],[' '],PChar(Fields[0].AsString),AIPList);
        if AIPList.Count<>3 then
        begin
          AErrMsg:='解析SFC系統標籤服務器地址(LABEL_PATH或LABEL_PATH_OA)有誤.';
          Exit;
        end;
        AServer:= AIPList[0];
        AUser := AIPList[1];
        APwd := AIPList[2];
      finally
        AIPList.Free;
      end;
    except
      on E:Exception do
      begin
        AErrMsg := E.Message;
        Exit;
      end;
    end;
  end;

  with ANetRes do
  begin
    dwScope := RESOURCE_GLOBALNET	;
    dwType :=  RESOURCETYPE_DISK;//RESOURCETYPE_ANY;//;
    dwDisplayType :=RESOURCEDISPLAYTYPE_GENERIC;//RESOURCEDISPLAYTYPE_SHARE;
    dwUsage := RESOURCEUSAGE_CONNECTABLE	;
    lpLocalName := ''; //为空值或nil时用户电脑上不会出现相关盘符
    lpRemoteName := PChar(AServer);
    lpProvider := '';
  end;
  Result:= WNetAddConnection2(ANetRes,PChar(APwd),PChar(AUser),0)=NO_ERROR;
// Result:= WNetAddConnection2(ANetRes,PChar('Pupload141205'),PChar('10.132.224.97\printupload'),0)=NO_ERROR;
  i:=GetLastError;
  // Result := i=ERROR_ALREADY_ASSIGNED;
  if not Result then
  begin
    case i of
      ERROR_ACCESS_DENIED	: AErrMsg := '獲取網絡資源被拒絕.';
      ERROR_BAD_DEV_TYPE	: AErrMsg := '本地設備類型和網絡資源類型不匹配.';
      ERROR_BAD_DEVICE	  : AErrMsg := '本地映射名稱無效.';
      ERROR_BAD_NET_NAME	: AErrMsg := '找不到遠程指定的資源.';
      ERROR_BAD_PROFILE	  : AErrMsg := '用戶資源格式不正確.';
      ERROR_BAD_PROVIDER	: AErrMsg := 'lpProvider指定的值与任何提供程序都不匹配.';
      ERROR_BUSY          : AErrMsg := '路由器或提供商繁忙,可能正在初始化,請重試.';
      ERROR_CANCELLED	    : AErrMsg := '網絡映射被取消了,請重試.';
      ERROR_CANNOT_OPEN_PROFILE	: AErrMsg :='系統無法打開用戶配置文件以處理持久連接.';
      ERROR_DEVICE_ALREADY_REMEMBERED	: AErrMsg := '用戶配置文件中已存在lpLocalName中指定的項目.';
      ERROR_EXTENDED_ERROR  	: AErrMsg := '發生特定的網絡錯誤.';
      ERROR_INVALID_PASSWORD  : AErrMsg := '連接標籤服務器的密碼無效.';
      ERROR_NO_NET_OR_BAD_PATH: AErrMsg := '網絡組件尚未啟動或者無法處理指定的名稱.';
      ERROR_NO_NETWORK        : AErrMsg := '沒有網絡';
      else
        AErrMsg := '連接標籤服務器出錯.';
    end;
    Exit;
  end;
  Result := True;
end;

 

//获取本文件(exe或dll)的版本号
function GetFileVersion(fn: string; var ma, mi, r ,b: integer):boolean;//得到本程序的版本?
var
  buf, p: pChar;
  sver: ^VS_FIXEDFILEINFO ;
  i: LongWord;
begin
  i:= GetFileVersionInfoSize(pchar(fn), i);
  new(sver);
  p:= pchar(sver);
  GetMem(buf, i);
  ZeroMemory(buf, i);
  result:= false;
  if GetFileVersionInfo(pchar(fn), 0, 4096, pointer(buf)) then
    if VerQueryValue(buf, '\', pointer(sver), i) then begin
      ma:= sVer^.dwFileVersionMS shr 16;
      mi:= sver^.dwFileVersionMS and $0000ffff;
      r:= sver^.dwFileVersionLS shr 16;
      b:= sver^.dwFileVersionLS and $0000ffff;
      result:= true;
    end;
  Dispose(p);
  FreeMem(buf);
end;

调用方法:
 GetFileVersion(GetModuleName(HInstance),args0,args1,args2,args3)

  

 

posted on 2020-04-30 16:06  天上星  阅读(182)  评论(0)    收藏  举报

导航