Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ошибка с AnsiString в dll, Linker Error при использовании String 
:(
    Опции темы
Slava99
Дата 2.6.2008, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Возникла такая проблема: при использовании во внутренних функциях dll типа AnsiString возникают различные 
Linker Error-ы, например такие:

[Linker Error] Error: Unresolved external 'System::__linkproc__ __fastcall LStrClr(void *)' referenced from C:\PROGRAM FILES\BORLAND\BDS\4.0\LIB\DEBUG\VCLE.LIB|dstring
[Linker Error] Error: Unresolved external 'System::__linkproc__ __fastcall LStrFromPChar(System::AnsiString&, char *)' referenced from C:\PROGRAM FILES\BORLAND\BDS\4.0\LIB\DEBUG\VCLE.LIB|dstring
[Linker Error] Error: Unresolved external 'System::__linkproc__ __fastcall LStrAsg(void *, const void *)' referenced from C:\PROGRAM FILES\BORLAND\BDS\4.0\LIB\DEBUG\VCLE.LIB|dstring

Возникают эти ошибки если просто объявить переменную типа AnsiString или вызвать какую-нибудь функцию (из модуля SysUtils например,
да из любого), у которой один из параметров AnsiString в любой из функций или классов моего модуля
Причем такая деталь, если этот модуль подключить не к dll, а к exe проекту всё компилируется и работает отлично...
PM MAIL   Вверх
mrbrooks
Дата 2.6.2008, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



Цитата

//---------------------------------------------------------------------------
//   Important note about DLL memory management when your DLL uses the
//   static version of the RunTime Library:
//
//   If your DLL exports any functions that pass String objects (or structs/
//   classes containing nested Strings) as parameter or function results,
//   you will need to add the library MEMMGR.LIB to both the DLL project and
//   any other projects that use the DLL.  You will also need to use MEMMGR.LIB
//   if any other projects which use the DLL will be performing new or delete
//   operations on any non-TObject-derived classes which are exported from the
//   DLL. Adding MEMMGR.LIB to your project will change the DLL and its calling
//   EXE's to use the BORLNDMM.DLL as their memory manager.  In these cases,
//   the file BORLNDMM.DLL should be deployed along with your DLL.
//
//   To avoid using BORLNDMM.DLL, pass string information using "char *" or
//   ShortString parameters.
//
//   If your DLL uses the dynamic version of the RTL, you do not need to
//   explicitly add MEMMGR.LIB as this will be done implicitly for you
//---------------------------------------------------------------------------

либо облюдаем это условие либо замени AnsiString на char*
PM MAIL   Вверх
Slava99
Дата 2.6.2008, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Это условие надо соблюдать при экспорте/импорте строк, у меня же они используются внутри.
Например, я пытаюсь вызвать ф-цию FindFirst(AnsiString path, ...) и возникают ошибки.
PM MAIL   Вверх
mrbrooks
Дата 2.6.2008, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



А ты хочешь сказать при использование стандартных функций?

Добавлено через 52 секунды
Здается мне тогда что здесь вся фича в области видимости

Добавлено через 1 минуту и 42 секунды
Попробуй так
Код

::FindFirst(AnsiString path, ...) 

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


Опытный
**


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

Репутация: нет
Всего: 1



а я юзаю ShortString в Dll


--------------------

Oracle 11.2.0.3.0
FireBird 1.0-2.5


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


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



Цитата(TaNK @ 2.6.2008,  14:39)
а я юзаю ShortString в Dll

Не имхо у него какие то траблы как я понял с вызовом стандартных функций 
PM MAIL   Вверх
TaNK
Дата 2.6.2008, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 1



> mrbrooks 
код в студию наверное


--------------------

Oracle 11.2.0.3.0
FireBird 1.0-2.5


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


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



Цитата(TaNK @ 2.6.2008,  14:43)
> mrbrooks 
код в студию наверное

 smile  ТочняГ. А то прям как телепаты гадаем  smile 
PM MAIL   Вверх
Slava99
Дата 2.6.2008, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Дело в том, что объявить локально, внутри своей функции, не экспортируемой, переменную AnsiString я тоже не могу.
Простой пример (на бессмысленность кода не обращай внимания, важен сам принцип):
Код

//---------------------------------------------------------------------------

#include <windows.h>
#include <SysUtils.hpp>
#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
    return 1;
}
//---------------------------------------------------------------------------
extern "C" int __export __stdcall Start(int x, int y);

char* MyFunc(void)
{
    AnsiString s;
    return s.c_str();
}

int __stdcall Start(int x, int y)
{
    MyFunc();
    return x * y;
}


такая ошибка:
[Linker Error] Error: Unresolved external 'System::__linkproc__ __fastcall LStrClr(void *)' referenced from C:\PROGRAM FILES\BORLAND\BDS\4.0\LIB\DEBUG\VCLE.LIB|dstring
Можно вызвать стандартную ф-цию с параметром AnsiString, или самому его использовать, одно и то же.
Если убрать объявление s, ошибок не возникает
PM MAIL   Вверх
mrbrooks
Дата 2.6.2008, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



ок. а ты воздержись от использования в dll вообще AnsiString и используй char*
PM MAIL   Вверх
TaNK
Дата 2.6.2008, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 1



>Slava99
ты как хочешь загружать dll - динамически или статически?


--------------------

Oracle 11.2.0.3.0
FireBird 1.0-2.5


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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 1
Всего: 36



Цитата(Slava99 @  2.6.2008,  14:03 Найти цитируемый пост)
Это условие надо соблюдать при экспорте/импорте строк

Это условие необходимо соблюдать при использовании AnsiString.
PM MAIL   Вверх
Slava99
Дата 2.6.2008, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Связывание будет и динамическое и статическое. Все будет зависеть от того, где ее потом будут использовать.
 Вот получше пример:
Код

//---------------------------------------------------------------------------

#include <windows.h>
#include <SysUtils.hpp>
#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
    return 1;
}
//---------------------------------------------------------------------------
extern "C" int __export __stdcall Start(int y);

int MyFunc(void)
{
    return AnsiPos("a", "string a");
}

int __stdcall Start(int y)
{

    return MyFunc() * y;
}

Здесь уже не получится работать с char*... Ну здесь-то можно обойтись без AnsiPos, но вообще мне требуется вызывать
стандартные ф-ции, использующие в качестве параметров класс AnsiString. Ошибка та же.
PM MAIL   Вверх
mrbrooks
Дата 2.6.2008, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



Это почему нельзя. Найти первое вхождение в массив символов очень даже можно  smile  
PM MAIL   Вверх
Fazil6
Дата 2.6.2008, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 11
Всего: 60



use vcl в свойствах проекта поставь
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

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


 




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


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

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