Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TStrings* в DLL, А именно возврат. 
V
    Опции темы
Mpak
Дата 25.4.2008, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Есть функцияв 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


--------------------
В любой откомпилированной программе есть, по крайней мере, одна ошибка...
P.S. А у меня их минимум две...
PM MAIL ICQ   Вверх
Mpak
Дата 25.4.2008, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Хмм...потестил...
Код

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 строчке вылетает... объясните что к чему?


--------------------
В любой откомпилированной программе есть, по крайней мере, одна ошибка...
P.S. А у меня их минимум две...
PM MAIL ICQ   Вверх
586
Дата 25.4.2008, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Ошибка в 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;
}

PM   Вверх
Mpak
Дата 25.4.2008, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

 TStringList* Result;
 Result = new TStringList;

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


--------------------
В любой откомпилированной программе есть, по крайней мере, одна ошибка...
P.S. А у меня их минимум две...
PM MAIL ICQ   Вверх
586
Дата 25.4.2008, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Создавать объект в 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'));

У тебя здесь будет утечка памяти, возвращаемый объект не уничтожается.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

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


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

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


 




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


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

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