Open mjafartp opened 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.
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. Update: 2022-05-11
Thanks, very helpful. However, the latest version has not been updated to pub.dev
, so I can only change it myself.
On windows release app it showing a terminal window popup and closing automatically.