SimConnect. Установка, открытие, закрытие сеанса — Simconnect

1 2

Автор serg_p:

Отправлено 09 December 2012 — 14:00

‘dmi-shef’ сказал(а) 09 Дек 2012 — 13:28:snapback.png

… Кстати проблему с несовместимостью типов, о которой я писал выше, решил. Мне надо было только получить подтверждение, что такое преобразование в данном примере возможно. А как это сделать, я уже знаю. …

Интересно узнать, как решили. Если сделали преобразование — то это криво. Здесь нужно переделать Paths, что бы он работал со строками, состоящими не из char, а из wchar_t. Если у Вас по умолчанию — Unicode. Собственно все эти PSTRINGZ и LPCWSTR — просто макросы, которые скрывают в себе указатели на массивы из элементов типа char, либо wchar_t.

‘dmi-shef’ сказал(а) 09 Дек 2012 — 13:28:snapback.png

… И еще. Сообщения IDE VC2010 об ошибках и предупреждения навели на мысль о том, что похоже некоторые коды SimCinnect-а написаны даже не на ранней версии С++, а вообще на С. Если это так, то становятся понятными некоторые проблемы совместимости.

Весь SimConnect.h — это C.

По поводу сообщений VC2010. МС постоянно накручивают безопасность, постоянно добавляют безопасные аналоги функций. С этим нужно быть аккуратным. Внимательно читать MSDN.

Например, некоторые функции, с суффиксом _s на конце, могут, при переполнении буффера, просто тихо закрывать сим. Эту тему я глубоко не изучал. Тут похоже надо поколупаться с _set_invalid_parameter_handler. Я сейчас предпочитаю использовать функции вида:
strncpy_s,
_snprintf_s
то же безопасные функции, но с буквочкой n внутри.
В них есть дополнительный параметр — Count, который можно задать, как _TRUNCATE. В этом случае, если результирующая строка получилась длиннее указанного буфера — она просто обрежется и никакого вылета сима не произойдет. Но функция вернет значение, по которому можно определеить, что произошло усечение строки, ну и предпринять необходимые действия в этом случае.

Вот что, например, написано в MSDN про _TRUNCATE в _snprintf_s:
«_snprintf_s returns -1 to indicate that truncation occurred» 

Отправлено 09 December 2012 — 19:04

‘serg_p’ сказал(а) 09 Дек 2012 — 15:00:snapback.png

Интересно узнать, как решили. Если сделали преобразование — то это криво. Здесь нужно переделать Paths, что бы он работал со строками, состоящими не из char, а из wchar_t. Если у Вас по умолчанию — Unicode. Собственно все эти PSTRINGZ и LPCWSTR — просто макросы, которые скрывают в себе указатели на массивы из элементов типа char, либо wchar_t.

У меня кодировка Unicode. 
Делал несколько вариантов.
1. Просто вставил имя библиотеки SimConnect.dll в функцию LoadLibrary. Класс путей и имен из Paths при этом не использовал. Конвертируется без ошибок, но понимаю, что такой вариант для работы на других компьютерах наверняка не будет работать.
2. Сделал преобразование переменной в функции strlen в Paths.h, вставил туда небольшой код, подсмотренный на одном из форумов. Тоже ошибок не показывает, но я не конвертировал его.
3. Основной на сегодня вариант. Сделал небольшие преобразования в коде Paths.h на основе типа расширенной строки. Вот что получилось:

// =========== Класс получения всех путей и имен файлов ===========

wchar_t nameSimConnectDll[] = L»SimConnectSP1\SimConnect.dll»; // Идентификатор имени файла библиотеки типа wchar_t (расширенная строка)

class Paths
{
public:
enum {minLenNameSimConnectDll = 4}; // Минимальная длина имени файла библиотеки

Paths(); // Объект Patch
~Paths();
LPCWSTR GetFullNameSimConnectDll() // Прототип функции получения полного имени файла библиотеки
{
return fullNameSimConnectDll_; 
}
size_t LenFullNameSimConnectDll() // Прототип получения длины полного имени файла библиотеки без учета нулевого символа 
{
return wcslen(fullNameSimConnectDll_);
}

protected:
BOOL initOk_;
TCHAR pathToThisDll_[MAX_PATH];
TCHAR fullNameSimConnectDll_[MAX_PATH];
};

В файле .cpp оставил код без изменений. Ошибок нет, конвертация в dll прошла успешно.

За подсказку про суффикс _s спасибо, заменил все функции, где он требовался. 

1 2