-
Notifications
You must be signed in to change notification settings - Fork 209
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
Comments
To avoid terminal windows showing up, I change 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. |
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); |
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. |
Thanks, very helpful. However, the latest version has not been updated to |
On windows release app it showing a terminal window popup and closing automatically.
The text was updated successfully, but these errors were encountered: