BestBurning / platform_device_id

flutter plugin to get device id
https://pub.dev/packages?q=platform_device_id
BSD 3-Clause "New" or "Revised" License
81 stars 203 forks source link

A terminal window popup showing on opening app - Windows #15

Open mjafartp opened 3 years ago

mjafartp commented 3 years ago

On windows release app it showing a terminal window popup and closing automatically.

cailirl980519 commented 3 years ago

To avoid terminal windows showing up, I change void PlatformDeviceIdWindowsPlugin::HandleMethodCall in platform_device_id/platform_device_id_windows/windows/platform_device_id_windows_plugin.cpp to following:

void PlatformDeviceIdWindowsPlugin::HandleMethodCall(
    const flutter::MethodCall<flutter::EncodableValue> &method_call,
    std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
  std::string strResult;
  std::string deviceId;

  if (method_call.method_name().compare("getDeviceId") == 0) {
    std::string cmd = "wmic csproduct get UUID";
    HANDLE hPipeRead, hPipeWrite;
    SECURITY_ATTRIBUTES saAttr = {sizeof(SECURITY_ATTRIBUTES)};
    saAttr.bInheritHandle = TRUE; // Pipe handles are inherited by child process.
    saAttr.lpSecurityDescriptor = NULL;
    CreatePipe(&hPipeRead, &hPipeWrite, &saAttr, 0);
    STARTUPINFOW si = {sizeof(STARTUPINFOW)};
    si.dwFlags     = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
    si.hStdOutput  = hPipeWrite;
    si.hStdError   = hPipeWrite;
    si.wShowWindow = SW_HIDE; // Prevents cmd window from flashing.
    PROCESS_INFORMATION pi = { 0 };
    BOOL fSuccess = CreateProcessW(NULL, (LPWSTR)towstring(cmd).c_str(), NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
    if (! fSuccess) {
        CloseHandle(hPipeWrite);
        CloseHandle(hPipeRead);
    } else {
      bool bProcessEnded = false;
      for (; !bProcessEnded ;) {
          // Give some timeslice (50 ms), so we won't waste 100% CPU.
          bProcessEnded = WaitForSingleObject( pi.hProcess, 50) == WAIT_OBJECT_0;
          // Even if process exited - we continue reading, if
          // there is some data available over pipe.
          for (;;)
          {
              char buf[1024];
              DWORD dwRead = 0;
              DWORD dwAvail = 0;
              if (!::PeekNamedPipe(hPipeRead, NULL, 0, NULL, &dwAvail, NULL) || !dwAvail || !::ReadFile(hPipeRead, buf, min(sizeof(buf) - 1, dwAvail), &dwRead, NULL) || !dwRead)
                  break;
              buf[dwRead] = 0;
              strResult += buf;
          }
      }
      CloseHandle(hPipeWrite);
      CloseHandle(hPipeRead);
      CloseHandle(pi.hProcess);
      CloseHandle(pi.hThread);
    }
    std::size_t pos = strResult.find("\n");
    deviceId = strResult.substr(pos+1);
    result->Success(flutter::EncodableValue(deviceId));
  } else {
    result->NotImplemented();
  }
}

This solution works for me.

hamzamon commented 2 years ago

build error C2660: 'CreateProcessW': function does not take 9 arguments [D:\Project\App\Flutter\app-desktop\build\windows\plugins\platform_device_id_windows\platform_device_id_windows_plugin.vcxproj]

BOOL fSuccess = CreateProcessW(NULL, (LPWSTR)towstring(cmd).c_str(), NULL, 0, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);

wangbax commented 2 years ago

I also encountered this problem, I fixed it in the following way, parsing the command directly at the dart layer.

    final process = await Process.start(
      'wmic',
      ['csproduct', 'get', 'UUID'],
      mode: ProcessStartMode.detachedWithStdio,
    );
    final result = await process.stdout.transform(utf8.decoder).toList();
    String? deviceID;
    for (var element in result) {
      final item = element.replaceAll(RegExp('\r|\n|\\s|UUID|uuid'), '');
      if (item.isNotEmpty) {
        deviceID = item;
      }
    }
    debugPrint('uuid: $deviceID');

Referring to Unity deviceUniqueIdentifier , I generated a Flutter deviceUniqueIdentifier in windows platfrom, hope it help. Update: 2022-05-11

6ag commented 1 year ago

Thanks, very helpful. However, the latest version has not been updated to pub.dev, so I can only change it myself.