//初始化套接字
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)