Я хочу получить имя профиля пользователя Windows из моего настольного приложения Flutter. Есть ли способ получить его?





Метод win32 для этого — GetUserName . Вместо того, чтобы мучиться с настройкой плагина с каналом метода, мы можем вызвать это напрямую с помощью ffi. Вам понадобятся пакеты ffi и win32.
import 'dart:ffi';
import 'package:ffi/ffi.dart';
import 'package:win32/win32.dart';
// This is the max win32 username length. It is missing from the win32 package,
// so we'll just create our own constant.
const unLen = 256;
String getUsername() {
return using<String>((arena) {
final buffer = arena.allocate<Utf16>(sizeOf<Uint16>() * (unLen + 1));
final bufferSize = arena.allocate<Uint32>(sizeOf<Uint32>());
bufferSize.value = unLen + 1;
final result = GetUserName(buffer, bufferSize);
if (result == 0) {
GetLastError();
throw Exception(
'Failed to get win32 username: error 0x${result.toRadixString(16)}');
}
return buffer.toDartString();
});
}
Насколько я знаю, все это не зависит от архитектуры. Я тестировал его на 64-битной машине с Windows 11. Как вы думаете, какая часть зависит от архитектуры?
Я думал о длине имени пользователя и uint.
Функция использует uint32 независимо от архитектуры процессора. Я не могу найти альтернативные версии заголовочного файла с большим значением UN_LEN. Если вы хотите быть параноиком, вы можете выделить больше байтов на случай, если Microsoft увеличит максимальную длину имен пользователей в будущем. Лично я бы не стал беспокоиться, но дополнительный килобайт или около того оперативной памяти, который используется для одного вызова и мгновенно освобождается, вряд ли вызовет проблемы в любой современной системе.
Это также работает для x64, если я только изменю параметры x32 на x64?