Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> StrTraitMFC, Реальная задачка (VC70) 
:(
    Опции темы
Fantasist
Дата 13.7.2004, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



Итак, это то, с чем я столкнулся и что решил довольно грубым методом.

Есть lib файл стороннего разработчика, скомпилированном на VC70 (как видно из самого файла). Этот либ экспортирует классы (declspec dllimport/dllexport). Есть и заголовочный файл с описанием этих классов. Так вот при рассматривании этого файла, обнаруживаем экспортный символ такого вида:

Код

__imp_?OpenFrom@CBaseTable@@QAEJAAV?$CStringT@DV?$StrTraitMFC_DLL@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@J@Z



Это так выглядить декорированный метод CBaseTable::OpenFrom(CString&, long); в этой либе. У меня есть такое описание, но при его компиляции моя VS порождает вот такой вот декорированный символ:

Код

__imp_?OpenFrom@CBaseTable@@QAEJAAV?$CStringT@DV?$StrTraitMFC@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@J@Z



Как видите, вместо StrTraitMFC_DLL используется StrTraitMFC. Это один из параметров шаблона класса CString, который каждый может найти в afxstr.h. Естесственно, на этапе линковки все это дело обламывается, так как символы не совпадают.

Вот вопрос, у кого есть VS7.x не скажет ли он какой у него в этом месте класс. Или может кто-то слышал о таких косяках и методах борьбы с ними. Я, конечно, это обошел, но довольно грубо.

Это сообщение отредактировал(а) Fantasist - 14.7.2004, 00:00


--------------------
Волны гасят ветер...
PM MAIL   Вверх
AndyY
Дата 14.7.2004, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 8.5.2004
Где: СПб

Репутация: 2
Всего: 4



Fantasist
возможно проблема в том, что в либе используется линковка MFC в виде DLL, а у вас в проекте - статически


--------------------
PM MAIL WWW   Вверх
Fantasist
Дата 14.7.2004, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



Цитата(AndyY @ 14.7.2004, 11:38)
Fantasist
возможно проблема в том, что в либе используется линковка MFC в виде DLL, а у вас в проекте - статически

Если бы все было бы так просто я бы не постил сюда вопрос. Меня тоже вначале суффикс _DLL смутил, но я изучил исходники - там никаких подстановок нет, да и зачем они в шаблонном классе? Он в любом случае залинкуется статически - его реализацию в dll не вынесешь. На всякий случай я все же попробовал разные типы линковки - результат оказался ожидаемым.


--------------------
Волны гасят ветер...
PM MAIL   Вверх
mr.DUDA
Дата 15.7.2004, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



Шаблон-то он шаблон, но вот подстановка его аргументов зависит от макросов типа "AFX_DLL". Поясняю.

Вышеприведённые классы:
Цитата
template< typename _CharType = char, class StringIterator = ATL::ChTraitsCRT< _CharType > >
class StrTraitMFC :
   
public StringIterator
{
public:
   
static HINSTANCE FindStringResourceInstance( UINT nID ) throw()
    {
       
return( AfxFindStringResourceHandle( nID ) );
    }

   
static ATL::IAtlStringMgr* GetDefaultManager() throw()
    {
       
return( AfxGetStringManager() );
    }
};

template< typename _CharType, class StringIterator>
class StrTraitMFC_DLL : public StringIterator
{
public:
   
static HINSTANCE FindStringResourceInstance( UINT nID ) throw()
    {
       
return( AfxFindStringResourceHandle( nID ) );
    }

   
static ATL::IAtlStringMgr* GetDefaultManager() throw()
    {
       
return( AfxGetStringManager() );
    }
};


И в зависимости от макросов получается:
Цитата
// MFC-enabled compilation. Use MFC memory management and exceptions;
// also, use MFC module state.

// Don't import when MFC dll is being built
#if !defined(_WIN64) && defined(_AFXDLL)

#if defined(_MFC_DLL_BLD)

template class ATL::CSimpleStringT< char, true >;
template class ATL::CStringT< char, StrTraitMFC_DLL< char > >;
template class ATL::CSimpleStringT< wchar_t, true >;
template class ATL::CStringT< wchar_t, StrTraitMFC_DLL< wchar_t > >;

#else

template class __declspec
(dllimport) ATL::CSimpleStringT< char, true >;
template class __declspec(dllimport) ATL::CStringT< char, StrTraitMFC_DLL< char > >;
template class __declspec(dllimport) ATL::CSimpleStringT< wchar_t, true >;
template class __declspec(dllimport) ATL::CStringT< wchar_t, StrTraitMFC_DLL< wchar_t > >;
#if defined(_NATIVE_WCHAR_T)
template class __declspec(dllimport) ATL::CSimpleStringT< unsigned short, true >;
template class __declspec(dllimport) ATL::CStringT< unsigned short, StrTraitMFC_DLL< unsigned short > >;
#endif    // _NATIVE_WCHAR_T

#endif    // _MFC_DLL_BLD

typedef ATL::CStringT< wchar_t, StrTraitMFC_DLL< wchar_t > > CStringW;
typedef ATL::CStringT< char, StrTraitMFC_DLL< char > > CStringA;
typedef ATL::CStringT< TCHAR, StrTraitMFC_DLL< TCHAR > > CString;

#else

typedef
ATL::CStringT< wchar_t, StrTraitMFC< wchar_t > > CStringW;
typedef ATL::CStringT< char, StrTraitMFC< char > > CStringA;
typedef ATL::CStringT< TCHAR, StrTraitMFC< TCHAR > > CString;

#endif    // !_WIN64 && _AFXDLL



--------------------
user posted image
PM MAIL WWW   Вверх
Fantasist
Дата 16.7.2004, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



Цитата
Шаблон-то он шаблон, но вот подстановка его аргументов зависит от макросов типа "AFX_DLL". Поясняю


Эту возможность я безусловно допускал, хотя не вижу в ней практического смысла, и проверил ее первым делом. Я же говорю, что внимательно изучил исходники и загаловочные файлы - StrTraitMFC_DLL в них нигде не встречается. Вдобавок, не полагаясь только на свою внимательность, я попробовал разные типы линковки. Между прочим, обо всем этом я уже сказал выше, и теперь фактически повторил свой вротой пост.

Естесственно, возникла у меня мысль, что в какой-то версии студии этот класс был добавлен или, наоборот, убран. В общем-то, оригинальный мой вопрос и был о том, не знает ли кто этих различий и у кого как (с версией студии).





--------------------
Волны гасят ветер...
PM MAIL   Вверх
mr.DUDA
Дата 17.7.2004, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



2 Fantasist,
Цитата
Я же говорю, что внимательно изучил исходники и загаловочные файлы - StrTraitMFC_DLL в них нигде не встречается. Вдобавок, не полагаясь только на свою внимательность, я попробовал разные типы линковки. Между прочим, обо всем этом я уже сказал выше, и теперь фактически повторил свой вротой пост

в моём ответе были использованы исходники из VS 2003.


--------------------
user posted image
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0576 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.