Похоже, что цель вашей функции была скопирована неправильно. Поскольку код не будет работать, как показано выше. Кажется, это ошибка копирования и вставки.
Чтобы исправить проблему, вам нужно сохранить результат, возвращенный функцией:
def earthConverter(latitude, longitude, height):
...
return x, y, z
x,y,z = earthConverter(123.0256, 56.45648, 21322.4545)
print('x is %f' % x)
Это - мой текущий происходящий работой код для обнаружения идентификатора устройства мониторинга, надежно.
CString DeviceID;
DISPLAY_DEVICE dd;
dd.cb = sizeof(dd);
DWORD dev = 0;
// device index
int id = 1;
// monitor number, as used by Display Properties > Settings
while (EnumDisplayDevices(0, dev, &dd, 0))
{
DISPLAY_DEVICE ddMon;
ZeroMemory(&ddMon, sizeof(ddMon));
ddMon.cb = sizeof(ddMon);
DWORD devMon = 0;
while (EnumDisplayDevices(dd.DeviceName, devMon, &ddMon, 0))
{
if (ddMon.StateFlags & DISPLAY_DEVICE_ACTIVE &&
!(ddMon.StateFlags & DISPLAY_DEVICE_MIRRORING_DRIVER))
{
DeviceID.Format (L"%s", ddMon.DeviceID);
DeviceID = DeviceID.Mid (8, DeviceID.Find (L"\\", 9) - 8);
}
devMon++;
ZeroMemory(&ddMon, sizeof(ddMon));
ddMon.cb = sizeof(ddMon);
}
ZeroMemory(&dd, sizeof(dd));
dd.cb = sizeof(dd);
dev++;
}
Мы играли с EnumDisplayDevices, чтобы обнаружить, если текущим производителем видеокарт является NVIDIA. Это не то же, но возможно это помогло бы. Наша часть была похожа на это:
int disp_num = 0;
BOOL res = TRUE;
do {
DISPLAY_DEVICE disp_dev_info;
ZeroMemory( &disp_dev_info, sizeof(DISPLAY_DEVICE) );
disp_dev_info.cb = sizeof(DISPLAY_DEVICE);
res = EnumDisplayDevices( 0, disp_num++, &disp_dev_info, 0x00000001 );
if(res &&
disp_dev_info.DeviceString[0]!=0 && disp_dev_info.DeviceString[0]=='N' &&
disp_dev_info.DeviceString[1]!=0 && disp_dev_info.DeviceString[1]=='V' &&
disp_dev_info.DeviceString[2]!=0 && disp_dev_info.DeviceString[2]=='I' &&
disp_dev_info.DeviceString[3]!=0 && disp_dev_info.DeviceString[3]=='D' &&
disp_dev_info.DeviceString[4]!=0 && disp_dev_info.DeviceString[4]=='I' &&
disp_dev_info.DeviceString[5]!=0 && disp_dev_info.DeviceString[5]=='A'){
isNVidia = true;
}
int x = 0;
}while( res != FALSE );
Довольно немой, но работа.
Я никогда не пытался делать его от сервиса, но EnumDisplayDevices
обычно работы хорошо, когда выполнено как пользователь. Я полагаю, что услуги работают в отдельном (и бездисплейный) сессия, которая могла объяснить проблему, которую Вы видите там.
Вы могли запустить программу помощника от своего сервиса, явившись олицетворением учетной записи пользователя, которая имеет доступ к дисплеям?
Метод Win32_DesktopMonitor только возвращает 1 монитор на моей машине Vista также. Идентификатор PnP, кажется, установлен правильно, все же.
У меня была быстрая игра с EnumDisplayDevices API, и в то время как это, кажется, обнаруживает детали адаптера надежно (по-видимому, потому что большинство людей не будет оставлять его как "Стандарт VGA" долгое время), это только возвращает "Монитор Plug and Play" для подключенных мониторов.
Это повторяет исследование, которое я провел в это несколько лет назад (должен был соединить некоторый код для помощи в стирании тех памятей).
Это из учетной записи обычного пользователя. Если у Вас есть надежный способ заставить EnumDisplayDevices возвращать идентификатор PnP, даже на сессиях обычного пользователя, мне было бы интересно - мы в настоящее время занимаемся расследованиями, если какая-либо эта информация доступна драйверу устройства.
Одна вещь, которую Вы могли сделать при выполнении кода от сессии № 0, не достаточно надежна, должен видеть, можно ли породить процесс помощника (или использование CreateProcessAsUser или использование COM с моникерами активации), это будет работать в контексте пользователя.