mfc — неразрешенный внешний символ при использовании wchar_t в управляемом проекте c ++

У меня есть один проект C ++ с настройками Unicode в качестве набора символов и опцией / clr для поддержки общеязыковой среды выполнения. Я вызываю какую-то функцию из MFC dll (с настройкой набора символов MultiByte) и получаю некоторую симпатичную ошибку для тех функций, которые используют wchar_t. Этот же DLL-файл является рабочим файлом для тех проектов Unicode C ++, в которых не задана опция / clr (т.е. не поддерживается общеязыковая среда выполнения). Я сделал Google и попробовал что-то вроде: —

  1. Замените Cstring на std: string, но оба дают одинаковую ошибку.

Пример для std: string: —

ошибка LNK2001: неразрешенный внешний символ «public: __thiscall
CEventLog :: CEventLog (wchar_t const *) «(?? 0CEventLog @@ QAE @ PB_W @ Z)

для Cstring: —

ошибка LNK2019: неразрешенный внешний символ «public: bool __thiscall»
CIITAdoField :: GetValue (класс ATL :: CStringT>> &) «(? ПолучитьЗначение @ CIITAdoField @@ QAE_NAAV? $ CStringT @ _WV? $ StrTraitMFC_DLL @ _WV? $ ChTraitsCRT @ _W @ ATL @@@@@ АТЛ @@@ Z)
упоминается в функции «public: bool __thiscall»
Iit :: DataFeedSvr :: SpeedCache :: CacheLoader>>, класс
Iit :: DataFeedSvr :: SpeedCache :: HolidayScheduleInfo, структура
Iit :: DataFeedSvr :: SpeedCache :: HolidayScheduleSpeedCacheParam>

:: Reload (класс Iit :: DataFeedSvr :: SpeedCache :: DoubleKeyCacheInstance>>, класс
Iit :: DataFeedSvr :: SpeedCache :: HolidayScheduleInfo, структура
Iit :: DataFeedSvr :: SpeedCache :: HolidayScheduleSpeedCacheParam> &,учебный класс
CIITAdoRecordset &, перечисление
Iit :: DataFeedSvr :: SpeedCache :: ERefreshType, класс
Iit :: DataFeedSvr :: SpeedCache :: CacheObserver const *) «(? Reload @? $ CacheLoader @ V? $ DoubleKeyCacheInstance @ JV? $ CStringT @ _WV? $ StrTraitMFC_DLL @ _WV? $ ChTraitsCRT @ _W @ ATL @@@@@ АТЛ @@ VHolidayScheduleInfo @ SpeedCache @ DataFeedSvr @ Iit @@ UHolidayScheduleSpeedCacheParam @ 456 @@ SpeedCache @ DataFeedSvr @ Iit @@@ SpeedCache @ DataFeedSvr @ Iit @@ QAE_NAAV? $ DoubleKeyCacheInstance @ СП? $ CStringT @ _WV? $ StrTraitMFC_DLL @ _WV? $ ChTraitsCRT @ _W @ АТЛ @@@@@ АТЛ @@ VHolidayScheduleInfo @ SpeedCache @ DataFeedSvr @ Iit @@ UHolidayScheduleSpeedCacheParam @ 456 @@ 234 @ AAVCIITAdoRecordset @@ W4ERefreshType @ 234 @ PBVCacheObserver @ 234 @@ Z)

  1. Я проверил настройку типа «Обрабатывать Wchar_t как встроенный тип», и это файл.
  2. Я попытался явно экспортировать функцию и класс, используя __declspec(dllexport) но не повезло.
  3. Я не могу изменить свой проект с юникода на многобайтовый или не могу изменить настройку параметра / clr, поскольку он начинает выдавать другую ошибку.

Пожалуйста, предложите решение. Заранее спасибо.

1

Решение

Сделайте ‘мусорную корзину’ на внешней DLL, чтобы увидеть, что экспортируется. Если ваш CEventLog :: CEventLog не экспортирует конструктор на основе символов, вы не сможете его импортировать, просто так.

Из вашего примера не видно, что ключ / clr вызывает проблему. Попробуйте создать новый проект Unicode (без CLR), чтобы убедиться, что вы действительно можете ссылаться на внешнюю DLL.

-1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]