Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
mjafartp opened this issue Apr 30, 2021 · 4 comments
Open

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

mjafartp opened this issue Apr 30, 2021 · 4 comments

Comments

@mjafartp
Copy link

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

@cailirl980519
Copy link

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
Copy link

hamzamon commented Feb 1, 2022

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
Copy link

wangbax commented Mar 10, 2022

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
Copy link

6ag commented Aug 9, 2023

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants