Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > ошибка с AnsiString в dll


Автор: Slava99 2.6.2008, 13:05
Возникла такая проблема: при использовании во внутренних функциях 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 проекту всё компилируется и работает отлично...

Автор: mrbrooks 2.6.2008, 13:25
Цитата

//---------------------------------------------------------------------------
//   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*

Автор: Slava99 2.6.2008, 14:03
Это условие надо соблюдать при экспорте/импорте строк, у меня же они используются внутри.
Например, я пытаюсь вызвать ф-цию FindFirst(AnsiString path, ...) и возникают ошибки.

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

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

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

::FindFirst(AnsiString path, ...) 

Автор: TaNK 2.6.2008, 14:39
а я юзаю ShortString в Dll

Автор: mrbrooks 2.6.2008, 14:41
Цитата(TaNK @ 2.6.2008,  14:39)
а я юзаю ShortString в Dll

Не имхо у него какие то траблы как я понял с вызовом стандартных функций 

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

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

 smile  ТочняГ. А то прям как телепаты гадаем  smile 

Автор: Slava99 2.6.2008, 15:01
Дело в том, что объявить локально, внутри своей функции, не экспортируемой, переменную 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, ошибок не возникает

Автор: mrbrooks 2.6.2008, 15:07
ок. а ты воздержись от использования в dll вообще AnsiString и используй char*

Автор: TaNK 2.6.2008, 15:10
>Slava99
ты как хочешь загружать dll - динамически или статически?

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

Это условие необходимо соблюдать при использовании AnsiString.

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

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

#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. Ошибка та же.

Автор: mrbrooks 2.6.2008, 15:25
Это почему нельзя. Найти первое вхождение в массив символов очень даже можно  smile  

Автор: Fazil6 2.6.2008, 15:25
use vcl в свойствах проекта поставь

Автор: Slava99 2.6.2008, 15:48
Все парни, спасибо! use vcl решило проблему.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)