Subversion Repositories userdetect2

Rev

Rev 73 | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. unit todo_more_identifications;
  2.  
  3. interface
  4.  
  5. function IsConnected: boolean;
  6. function GetHostname: string;
  7. function GetComputerName: String;
  8. function GetUserName: String;
  9. function GetSystemWinDir: string;
  10. function GetSystemDrive: AnsiChar;
  11. function GetOSVersion: string;
  12. function GetRegisteredOrganisation: string;
  13. function GetRegisteredOwner: string;
  14. function LaufwerkBereit(root: string): boolean;
  15. function GetMyDocuments: string;
  16. function GetLocalAppData: string;
  17. function GetWindowsDirectory: string;
  18. // function GetWifiSSID: string;
  19. function GetTempDirectory: String;
  20.  
  21. implementation
  22.  
  23. uses
  24.   Windows, SysUtils, Registry, wininet, shlobj;
  25.  
  26. type
  27.   EAPICallError = Exception;
  28.  
  29. function IsConnected: boolean;
  30. {$IF defined(ANDROID)}
  31. begin
  32.   result := IsConnectedAndroid;
  33. end;
  34. {$ELSEIF defined(MACOS)}
  35. //var
  36.   //IPW: TIdHTTP;
  37. begin
  38.   {$MESSAGE Warn 'Nicht implementiert für dieses OS'}
  39.   result := false;  // TODO: im zweifelsfall lieber true?
  40.  
  41.   // head verzögert den Programmfluss um 1-2 Sekunden...
  42.   // Ip-Watch würde auch eine LAN-Adresse zeigen
  43.   //TIdHTTP.Head('http://registration.rinntech.com');
  44.   //response.code=200 -> true
  45. end;
  46. {$ELSEIF defined(MSWINDOWS)}
  47. var
  48.   origin: Cardinal;
  49. begin
  50.   result := InternetGetConnectedState(@origin, 0);
  51. end;
  52. {$ELSE}
  53. begin
  54.   {$MESSAGE Warn 'Nicht implementiert für dieses OS'}
  55.   result := false;
  56. end;
  57. {$IFEND}
  58.  
  59. var CacheHostname: string;
  60. {$IFDEF MSWindows}
  61. function GetHostname: string;
  62. var
  63.   reg: TRegistry;
  64. begin
  65.   if CacheHostname <> '' then
  66.   begin
  67.     result := CacheHostname;
  68.     Exit;
  69.   end;
  70.   result := '';
  71.   reg := TRegistry.Create;
  72.   try
  73.     reg.RootKey := HKEY_LOCAL_MACHINE;
  74.     if reg.OpenKeyReadOnly
  75.       ('\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters') then
  76.     begin
  77.       result := reg.ReadString('Hostname');
  78.       reg.CloseKey;
  79.     end;
  80.   finally
  81.     reg.Free;
  82.   end;
  83.   CacheHostname := result;
  84. end;
  85. {$ELSE}
  86. function GetHostname: string;
  87. {$IFDEF MACOS}
  88. var
  89.   buff: array [0 .. 255] of AnsiChar;
  90. {$ENDIF}
  91. begin
  92.   if CacheHostname <> '' then
  93.   begin
  94.     result := CacheHostname;
  95.     Exit;
  96.   end;
  97.   {$IFDEF MACOS}
  98.   Posix.Unistd.gethostname(buff,sizeof(buff));
  99.   SetString(result, buff, AnsiStrings.strlen(buff));
  100.   CacheHostname := result;
  101.   {$ELSE}
  102.     {$IFDEF ANDROID}
  103.     result := '';
  104.     {$ELSE}
  105.     {$MESSAGE Warn 'Nicht implementiert für dieses OS'}
  106.     {$ENDIF}
  107.   {$ENDIF}
  108. end;
  109. {$ENDIF}
  110.  
  111. {$IFDEF MSWindows}
  112. function GetComputerName: String;
  113. var
  114.   buffer: array [0 .. MAX_PATH] of Char;
  115.   Size: dWord;
  116. begin
  117.   Size := SizeOf(buffer);
  118.   Windows.GetComputerName(buffer, Size);
  119.   SetString(result, buffer, lstrlen(buffer));
  120. end;
  121. {$ELSE}
  122. function GetComputerName: String;
  123. {$IFDEF MACOS}
  124. var
  125.   Pool: NSAutoreleasePool;
  126.   h : NSHost;
  127. {$ENDIF}
  128. begin
  129.   {$IFDEF MACOS}
  130.   NSDefaultRunLoopMode;
  131.   Pool := TNSAutoreleasePool.Create;
  132.     try
  133.     h := TNSHost.Wrap(TNSHost.OCClass.currentHost);
  134.     result := Format('%s',[h.localizedName.UTF8String]);
  135.   finally
  136.     Pool.drain;
  137.   end;
  138.   {$ELSE}
  139.     {$IFDEF ANDROID}
  140.     //TODO: anderer/richtiger name ... AccountManager for email adress, Telephony mngr etc.
  141.     result := JStringToString(TJBuild.JavaClass.SERIAL);
  142.     {$ELSE}
  143.     {$MESSAGE Warn 'Nicht implementiert für dieses OS'}
  144.     result := '';
  145.     {$ENDIF}
  146.   {$ENDIF}
  147. end;
  148. {$ENDIF}
  149.  
  150. {$IFDEF MACOS}
  151. function NSUserName: Pointer; cdecl; external '/System/Library/Frameworks/Foundation.framework/Foundation' name _PU +'NSUserName';
  152. function NSFullUserName: Pointer; cdecl; external '/System/Library/Frameworks/Foundation.framework/Foundation' name _PU + 'NSFullUserName';
  153. {$ENDIF}
  154.  
  155. {$IFDEF MSWindows}
  156. function GetUserName: String;
  157. var
  158.   buffer: array [0 .. MAX_PATH] of Char;
  159.   Size: dWord;
  160. begin
  161.   Size := SizeOf(buffer);
  162.  
  163.   if Windows.GetUserName(Buffer, Size) then
  164.   begin
  165.     // SetString(result, buffer, lstrlen(buffer));
  166.     Result := StrPas(Buffer);
  167.   end
  168.   else
  169.   begin
  170.     Result := '';
  171.   end;
  172. end;
  173. {$ELSE}
  174. function GetUserName: String;
  175. begin
  176.   {$IFDEF MACOS}
  177.   result := Format('%s',[TNSString.Wrap(NSUserName).UTF8String]);
  178.   {$ELSE}
  179.   {$MESSAGE Warn 'Nicht implementiert für dieses OS'}
  180.   result := '';
  181.   {$ENDIF}
  182. end;
  183. {$ENDIF}
  184.  
  185.  
  186.  
  187.  
  188.  
  189.  
  190.  
  191. {$IFDEF MSWindows}
  192. function GetSystemWinDir: string;
  193. var
  194.   h: HModule;
  195.   {$IFDEF UNICODE}
  196.   f: function(lpBuffer: LPWSTR; uSize: UINT): UINT; stdcall;
  197.   {$ELSE}
  198.   f: function(lpBuffer: LPSTR; uSize: UINT): UINT; stdcall;
  199.   {$ENDIF}
  200.   res: string;
  201.   cnt: UINT;
  202. begin
  203.   h := LoadLibrary(kernel32);
  204.   if h = 0 then RaiseLastOSError;
  205.  
  206.   {$IFDEF UNICODE}
  207.   @f := GetProcAddress(h, 'GetSystemWindowsDirectoryW');
  208.   {$ELSE}
  209.   @f := GetProcAddress(h, 'GetSystemWindowsDirectoryA');
  210.   {$ENDIF}
  211.  
  212.   SetLength(res, MAX_PATH);
  213.   if @f = nil then  // Assigned?
  214.   begin
  215.     // We are probably on Win9x where GetSystemWindowsDirectory* does not exist.
  216.     cnt := Windows.GetWindowsDirectory(PChar(res), MAX_PATH);
  217.   end
  218.   else
  219.   begin
  220.     // We are on a modern system where GetSystemWindowsDirectory* does exist.
  221.     // http://objectmix.com/delphi/402836-getting-hard-drive-letter-windows-runs.html
  222.     // Im Gegensatz zu GetWindowsDirectory zeigt GetSystemWindowsDirectory bei
  223.     // Terminalservern das System-Windows-Verzeichnis und nicht das "private"
  224.     // Windows-Verzeichnis des Users.
  225.     cnt := f(PChar(res), MAX_PATH);
  226.   end;
  227.  
  228.   if cnt <= 0 then RaiseLastOSError;
  229.   result := res;
  230. end;
  231. {$ELSE}
  232. function GetSystemWinDir: string;
  233. begin
  234.   {$MESSAGE Warn 'Nicht implementiert für dieses OS'}
  235.   result := '';
  236. end;
  237. {$ENDIF}
  238.  
  239. function GetSystemDrive: AnsiChar;
  240. var
  241.   res: string;
  242. begin
  243.   res := ExtractFileDrive(GetSystemWinDir);
  244.   Assert(Length(res) >= 1);
  245.   result := AnsiChar(res[1]);
  246. end;
  247.  
  248. function GetOSVersion: string;
  249. {$IF Declared(TOSVersion)}
  250. begin
  251.   result := TOSVersion.ToString;
  252. {$ELSE}
  253. var
  254.   VersionInfo: TOSVersionInfo;
  255. begin
  256.   VersionInfo.dwOSVersionInfoSize := SizeOf(VersionInfo);
  257.   GetVersionEx(VersionInfo);
  258.   result := IntToStr(VersionInfo.dwPlatformId) + '-' +
  259.     IntToStr(VersionInfo.dwMajorVersion) + '.' +
  260.     IntToStr(VersionInfo.dwMinorVersion) + '-' +
  261.     IntToStr(VersionInfo.dwBuildNumber)
  262. {$IFEND}
  263. end;
  264.  
  265. {$IFDEF MSWindows}
  266. function GetRegisteredOrganisation: string;
  267. var
  268.   reg: TRegistry;
  269.   k: string;
  270.   VersionInfo: TOSVersionInfo;
  271. begin
  272.   result := '';
  273.   reg := TRegistry.Create;
  274.   try
  275.     reg.rootkey := HKEY_LOCAL_MACHINE;
  276.  
  277.     VersionInfo.dwOSVersionInfoSize := SizeOf(VersionInfo);
  278.     GetVersionEx(VersionInfo);
  279.  
  280.     if VersionInfo.dwPlatformId = VER_PLATFORM_WIN32_NT then
  281.     begin
  282.       k := '\Software\Microsoft\Windows NT\CurrentVersion';
  283.     end
  284.     else
  285.     begin
  286.       k := '\Software\Microsoft\Windows\CurrentVersion';
  287.     end;
  288.     if reg.OpenKeyReadOnly(k) then
  289.     begin
  290.       result := reg.ReadString('RegisteredOrganization');
  291.       reg.CloseKey;
  292.     end;
  293.   finally
  294.     reg.Free;
  295.   end;
  296. end;
  297. {$ELSE}
  298. function GetRegisteredOrganisation: string;
  299. begin
  300.   {$MESSAGE Warn 'Nicht implementiert für dieses OS'}
  301.   result := '';
  302. end;
  303. {$ENDIF}
  304.  
  305. {$IFDEF MSWindows}
  306. function GetRegisteredOwner: string;
  307. var
  308.   reg: TRegistry;
  309.   k: string;
  310.   VersionInfo: TOSVersionInfo;
  311. begin
  312.   result := '';
  313.   reg := TRegistry.Create;
  314.   try
  315.     reg.rootkey := HKEY_LOCAL_MACHINE;
  316.  
  317.     VersionInfo.dwOSVersionInfoSize := SizeOf(VersionInfo);
  318.     GetVersionEx(VersionInfo);
  319.  
  320.     if VersionInfo.dwPlatformId = VER_PLATFORM_WIN32_NT then
  321.     begin
  322.       k := '\Software\Microsoft\Windows NT\CurrentVersion';
  323.     end
  324.     else
  325.     begin
  326.       k := '\Software\Microsoft\Windows\CurrentVersion';
  327.     end;
  328.     if reg.OpenKeyReadOnly(k) then
  329.     begin
  330.       result := reg.ReadString('RegisteredOwner');
  331.       reg.CloseKey;
  332.     end;
  333.   finally
  334.     reg.Free;
  335.   end;
  336. end;
  337. {$ELSE}
  338. function GetRegisteredOwner: string;
  339. begin
  340.   {$MESSAGE Warn 'Nicht implementiert für dieses OS'}
  341.   result := '';
  342. end;
  343. {$ENDIF}
  344.  
  345. {$IFDEF MSWindows}
  346. function LaufwerkBereit(root: string): boolean;
  347. var
  348.   Oem: cardinal;
  349.   Dw1, Dw2: DWORD;
  350. begin
  351.   // http://www.delphi-treff.de/tipps/system/hardware/feststellen-ob-ein-laufwerk-bereit-ist/
  352.   Oem := SetErrorMode(SEM_FAILCRITICALERRORS);
  353.   result := GetVolumeInformation(PCHAR(Root), nil, 0, nil, Dw1, Dw2, nil, 0);
  354.   SetErrorMode(Oem) ;
  355. end;
  356. {$ELSE}
  357. function LaufwerkBereit(root: string): boolean;
  358. begin
  359.   {$MESSAGE Warn 'Nicht implementiert für dieses OS'}
  360.   result := false;
  361. end;
  362. {$ENDIF}
  363.  
  364. {$IFDEF MSWindows}
  365. function GetMyDocuments: string;
  366. var
  367.   r: Bool;
  368.   path: array[0..Max_Path] of Char;
  369. begin
  370.   // TODO: Stattdessen ShGetFolderPath verwenden?
  371.   r := ShGetSpecialFolderPath(0, path, CSIDL_Personal, False);
  372.   if not r then
  373.     raise EAPICallError.Create('Could not find MyDocuments folder location.');
  374.   Result := Path;
  375. end;
  376. {$ELSE}
  377. function GetMyDocuments: string;
  378. begin
  379.   result := TPath.GetDocumentsPath;
  380. end;
  381. {$ENDIF}
  382.  
  383. {$IF not Defined(CSIDL_LOCAL_APPDATA)}
  384. const
  385.   CSIDL_LOCAL_APPDATA = $001c;
  386. {$IFEND}
  387.  
  388. {$IFDEF MSWindows}
  389. function GetLocalAppData: string;
  390. var
  391.   r: Bool;
  392.   path: array[0..Max_Path] of Char;
  393. begin
  394.   // TODO: Stattdessen ShGetFolderPath verwenden?
  395.   r := ShGetSpecialFolderPath(0, path, CSIDL_LOCAL_APPDATA, False);
  396.   if not r then
  397.     raise EAPICallError.Create('Could not find LocalAppData folder location.');
  398.   Result := Path;
  399. end;
  400. {$ELSE}
  401. function GetLocalAppData: string;
  402. begin
  403.   {$MESSAGE Warn 'Nicht implementiert für dieses OS'}
  404.   result := '';
  405. end;
  406. {$ENDIF}
  407.  
  408. {$IFDEF MSWindows}
  409. function GetWindowsDirectory: string;
  410. var
  411.   WinDir: PChar;
  412. begin
  413.   WinDir := StrAlloc(MAX_PATH);
  414.   try
  415.     Windows.GetWindowsDirectory(WinDir, MAX_PATH);
  416.     result := string(WinDir);
  417.   finally
  418.     StrDispose(WinDir);
  419.   end;
  420. end;
  421. {$ELSE}
  422. function GetWindowsDirectory: string;
  423. begin
  424.   {$MESSAGE Warn 'Nicht implementiert für dieses OS'}
  425.   result := '';
  426. end;
  427. {$ENDIF}
  428.  
  429. {$IFDEF MSWindows}
  430. function GetTempDirectory: String;
  431. var
  432.   tempFolder: array [0 .. MAX_PATH] of Char;
  433. begin
  434.   GetTempPath(MAX_PATH, @tempFolder);
  435.   result := StrPas(tempFolder);
  436. end;
  437. {$ELSE}
  438. function GetTempDirectory: String;
  439. begin
  440.   {$MESSAGE Warn 'Nicht implementiert für dieses OS'}
  441.   result := '';
  442. end;
  443. {$ENDIF}
  444.  
  445. end.
  446.