Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Вызов функции с параметром AnsiString ( С6 -> BDS2009 )

50K
15 июля 2009 года
Ku-Klux-Klan
4 / / 15.07.2009
Кто либо уже бодался с передачей AnsiString-а в фукцию вызывемую из статически прилинкованой DLL-ки собранной на C++ Builder 6 в С++ Builder 2009.
Уточняю:
Есть Dll-ка собранная на C++ Builder 6 в ней функция типа:
__declspec( dllexport ) void __fastcall ShowMyMessage( AnsiString MyMessage )
{
ShowMessage(MyMessage);
}
При попытке вызвать эту функцию в C++ Builder 2009 выдает:
[ILINK32 Error] Error: Unresolved external '__fastcall ShowMyMessage(System::AnsiStringT<0>)' referenced from C:\WORK\TESTDLL\DEBUG\EXEMAIN.OBJ

Копание в хидерах показало что AnsiString в 2009 определен как:
typedef AnsiStringT<0> AnsiString;

Может у кого есть идеи как прикрутить старые DLL-ки с вызовами AnsiString к С++ Builder 2009?
14
15 июля 2009 года
Phodopus
3.3K / / 19.06.2008
Вообще-то стринги передавать между DLL и EXE низя.
1
15 июля 2009 года
kot_
7.3K / / 20.01.2000
Цитата: Phodopus
Вообще-то стринги передавать между DLL и EXE низя.


Вобще-то можно. В статической по крайней мере можно - не скажу что это хорошая идея правда.
Проблема связана с линковкой самой длл. Проверьте параметры и пересоберите.

14
15 июля 2009 года
Phodopus
3.3K / / 19.06.2008
Цитата: kot_
не скажу что это хорошая идея правда.


именно это я и имел ввиду ;)
Т.к. разные менеджеры кучи дадут о себе знать рано или поздно необъяснимыми глюками. Кстати они саааавершенно разные в 6-м и 2009м. (в последнем FastMM который несколько упростил упомянутую мною проблему)

50K
16 июля 2009 года
Ku-Klux-Klan
4 / / 15.07.2009
Вопрос не о том правильно или нет использование AnsiString во внешних вызовах, а в том как передать параметр AnsiString в старую DLL-ку. Единственное решение которое мне пришло на ум - собрать буферную DLL-ку на том же C++ Builder 6, где все вызовы будут переведены на указатели на буфер строки. Ну что то типа:
__declspec( dllexport ) void __fastcall ShowMyMessage( LPCTSTR MyMessage )
{
ShowMessage( AnsiString( MyMessage ) );
}
50K
16 июля 2009 года
Ku-Klux-Klan
4 / / 15.07.2009
Цитата: kot_
Проблема связана с линковкой самой длл. Проверьте параметры и пересоберите.



Проблема не в линковке, а в определении AnsiString. В 6-ке AnsiString - это и есть AnsiString, а в 2009-ом AnsiString это AnsiStringT<0>, то есть уникодовый. Описание же старого AnsiString-а отсутствует вообще. :mad:

14
16 июля 2009 года
Phodopus
3.3K / / 19.06.2008
Цитата: Ku-Klux-Klan
Единственное решение которое мне пришло на ум - собрать буферную DLL-ку на том же C++ Builder 6


Неплохая мысль если есть такая возможность

Цитата: Ku-Klux-Klan
Проблема не в линковке


Блин.. ну вы хоть видите какую он вам ошибку выдает? Ошибка линкера - проблема в линковке. Такое впечатление что не написан _declspec(dllimport)

50K
28 июля 2009 года
Ku-Klux-Klan
4 / / 15.07.2009
Цитата: Phodopus
Блин.. ну вы хоть видите какую он вам ошибку выдает? Ошибка линкера - проблема в линковке. Такое впечатление что не написан _declspec(dllimport)



Видеть, то вижу, но линкер ищет '__fastcall ShowMyMessage(System::AnsiStringT<0>)', а нужно чтобы искал '__fastcall ShowMyMessage(System::AnsiString)'. В чем разница то понятно? Вопрос в том и стоит как заставить C++ Builder 2009 работать со старыми AnsiString-ами...:confused:

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог