XLL - это «недопустимая компиляция надстроек» с набором инструментов платформы Visual Studio 2019 - PullRequest
1 голос
/ 17 февраля 2020

Надстройка XLL для Excel была разработана на C ++ (кем-то еще) некоторое время go (первоначально в конце 1990-х годов, с некоторыми изменениями в 2013 году). Хотя я могу скомпилировать надстройку без сообщений об ошибках, используя VS2019 и набор инструментов платформы «vs142» (связанный с VS2019), при добавлении xll в Excel с помощью диспетчера надстроек Excel жалуется, что «... xll не является действительная надстройка. " Если я пересматриваю проект, в VS2019 исключительно , так что свойство конфигурации Platform Toolset имеет значение «vs100 (Visual Studio 10)», тогда надстройка компилируется и может быть зарегистрирована как правильно работающая надстройка в Excel.

Основное отличие, которое я вижу в списке предупреждений после перестроения решения с помощью Platform Toolset vs142 (ошибок нет), заключается в том, что везде есть директива в коде "#pragma EXPORT" предупреждение «ожидаемая» строка »; найдено« пользовательский строковый литерал ». Это не предупреждение при перестроении решения с использованием Toolset vs100.

EXPORT определен в проекте следующим образом (шаблон, следуя некоторому примеру в книге Далтона о C / C ++ и финансовых надстройках для Excel, я думаю.)

// to the world without having to maintain a .def file. Look in any exported
// function for how to use it.
#define EXPORT comment(linker, "/EXPORT:"__FUNCTION__"="__FUNCDNAME__)

Я не совсем уверен, с чего начать примирить эту разницу из-за в Platform Toolset (и версию C ++?). Для продолжения работы над этим проектом я бы хотел использовать последние версии VS и последний набор инструментов, так что помощь в понимании того, что и почему должны быть сделаны изменения, будет принята с благодарностью.

1 Ответ

1 голос
/ 17 февраля 2020

Это предупреждение / ошибка, по-видимому, связано с тем, что различные версии препроцессора MSVC обрабатывают конкатенации строк и букв в строках #pragma comment() (см. Примечание ниже). При добавлении пробелов между (заключенными в кавычки) литералами и макросами __FUNCxxx__ предупреждение исчезает (и это, скорее всего, устранит проблему с компоновщиком, приводящую к проблеме «недопустимая надстройка»).

Предполагая, что «проблема» появилась в выпуске VS-2015, можно обойти это, используя следующий код:

#if (_MSC_VER >= 1900) // This is for VS-2015 - see link below for others versions
#define EXPORT comment(linker, "/EXPORT:" __FUNCTION__ "=" __FUNCDNAME__)
#else
#define EXPORT comment(linker, "/EXPORT:"__FUNCTION__"="__FUNCDNAME__)
#endif

Вы можете иметь возможность использовать версию с добавленным пробелом более ранние компиляторы, но я добавил условное выражение, следуя философии: «Если ничего не сломано, не исправляйте его!»

Значения макроса _MSC_VER для использования в других версиях перечислено здесь .

ПРИМЕЧАНИЕ. Пример, приведенный на этой веб-странице Microsoft , включает пробелы между строковыми литералами и предопределенными макросами:

Для комментариев, которые принимают параметр comment-string, вы можете использовать макрос в любом месте, где вы будете использовать строковый литерал, при условии, что макрос расширяется до строкового литерала. Вы также можете объединить любую комбинацию строковых литералов и макросов, которые расширяются до строковых литералов. Например, допустимо следующее утверждение:

    #pragma comment( user, "Compiled on " __DATE__ " at " __TIME__ )
...