Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > TStrings* в DLL


Автор: Mpak 25.4.2008, 17:57
Есть функцияв DLL, которая собирает определенный набор строк и возвращает его.
Код DLL
Код

TStrings* CheckQuality(double *Vector, double *VectorMin, double *VectorMax, int Rows, char Key)
{
 TStrings *Result;
 AnsiString res;
 for (int i = 0; i<Rows; i++)
        {
         if (fabs(Vector[0]-Vector[i])<=VectorMax[i]-VectorMin[i])
                {
                 res = "В допуске";
                }
         else
                {
                 res = "Не в допуске";
                }
         Result->Add(res);
        }

 return Result;
}

Код ехе.cpp
Код

if (dllH)
 {Checking    = (CQ *)       GetProcAddress(dllH, "_CheckQuality");
   Main->ListCheckM->Items->AddStrings(Checking(M, MEm, MEp, Count_Rows, 'M'));
   Main->ListCheckA->Items->AddStrings(Checking(A, AEm, AEp, Count_Rows, 'A'));
 }


Код ехе.h
Код

//...
public:        // User declarations
        HINSTANCE dllH;
        typedef TStrings*(CQ (double*, double*, double*, int, char));
        CQ *Checking;
//...


В 15 строке DLL файла выдает ошибку... не могу понять почему...
Расскажите, пожалуйста smile

Автор: Mpak 25.4.2008, 18:33
Хмм...потестил...
Код

void __fastcall TLevel1::Button1Click(TObject *Sender)
{
TStrings* Res;
Res->Add("1");
Res->Add("2");
Res->Add("3");
Res->Add("4");
Res->Add("5");

Main->ListCheckA->Items->AddStrings(Res);

}

На 4 строчке вылетает... объясните что к чему?

Автор: 586 25.4.2008, 18:34
Ошибка в 15 строке из-за того, что ты не создаёшь объект. TStrings - абстрактный класс. У тебя не получится создать объект. Как вариант, передавай в функцию Memo1->Lines.
Код
void CheckQuality(TString* Result, double *Vector, double *VectorMin, double *VectorMax, int Rows, char Key)

Либо делай так:
Код
AnsiString CheckQuality(double *Vector, double *VectorMin, double *VectorMax, int Rows, char Key)
{
 AnsiString res;
 for (int i = 0; i<Rows; i++)
        {
         if (fabs(Vector[0]-Vector[i])<=VectorMax[i]-VectorMin[i])
                {
                 res = "В допуске";
                }
         else
                {
                 res = "Не в допуске";
                }
         res += "\r\n"; // новая строка
        }
 return Result;
}

Автор: Mpak 25.4.2008, 18:46
В очередной раз укоряю себя, за то что предварительно не посмотрел HELP к Билдеру  smile 
Код

 TStringList* Result;
 Result = new TStringList;

Вот так надо было объявить Result в DLL:)
А функция, как и предполагалось, TStrings* smile

Автор: 586 25.4.2008, 18:54
Создавать объект в DLL а уничтожать в exe нежелательно, это может привести к ошибкам, если статическая RTL.

Цитата(Mpak @  25.4.2008,  18:57 Найти цитируемый пост)
   Main->ListCheckM->Items->AddStrings(Checking(M, MEm, MEp, Count_Rows, 'M'));
   Main->ListCheckA->Items->AddStrings(Checking(A, AEm, AEp, Count_Rows, 'A'));

У тебя здесь будет утечка памяти, возвращаемый объект не уничтожается.

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