Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.01.2009, 10:40   #1
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию Проблема с DLL.

Не могу понять почему. На Borland C++ 6.0 написал DLL. Через неё мне нужно нужно прочитать файл и прочитаное вывести в программу.

Код:
AnsiString s;

        TStrings*kol=new TStringList;
        kol->LoadFromFile("file.txt");

        for (int i=0;i<kol->Count;i++){
        s=kol->Strings[i];
        if (s=="test")
        Memo1->Lines->Add(s);
}
Если я этот код пишу в программе то все отлично, строки читаються и строка которая равна test выводиться.

Но вот если я пишу в DLL:

Код:
AnsiString func(int i){
           AnsiString s;

        TStrings*kol=new TStringList;
        kol->LoadFromFile("file.txt");

        s=kol->Strings[i];
        if (s=="test")
        return s;
}}
Тогда файл не читается, не могу понять в чем причина. У меня в DLL подключены вот такие библиотеки :
#include <vcl.h>
#include <windows.h>
#include <string.h>
Уже парюсь n-й день. Помогите пожалуйста.

Последний раз редактировалось profi; 06.01.2009 в 10:43.
profi вне форума Ответить с цитированием
Старый 06.01.2009, 13:49   #2
0nni
Форумчанин
 
Аватар для 0nni
 
Регистрация: 24.07.2008
Сообщений: 279
По умолчанию

Нельзя возвращать указатель на локальную переменную.
Ты видел хоть одну WinApi функцию, которая возвращает указатель на символ?
Посмотри например как работает GetWindowText() - он работает с буфером
Еще вариант передавать в твою func() указатель на CallBack-функцию вида void f(pchar s) (я си плохо знаю, но вроде так), которая будет находиться в основной программе.
Сказал и загрустил от бесспорности своей правоты.
0nni вне форума Ответить с цитированием
Старый 06.01.2009, 16:04   #3
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Цитата:
Сообщение от 0nni Посмотреть сообщение
Нельзя возвращать указатель на локальную переменную.
Ты видел хоть одну WinApi функцию, которая возвращает указатель на символ?
Посмотри например как работает GetWindowText() - он работает с буфером
Еще вариант передавать в твою func() указатель на CallBack-функцию вида void f(pchar s) (я си плохо знаю, но вроде так), которая будет находиться в основной программе.
Вы сами поняли, что сказали??? Ни на какой символ я не возвращаю указатель. Не знаете С++ лучше не отвечайте.
profi вне форума Ответить с цитированием
Старый 06.01.2009, 17:03   #4
0nni
Форумчанин
 
Аватар для 0nni
 
Регистрация: 24.07.2008
Сообщений: 279
По умолчанию

Я понял что написал,
Я так понял "AnsiString func(int i)" экспортируемая функция внутри dll и используется внешней программой, если нет, то я не прав.
А в чем именно выражается "не читаеся"?
Сказал и загрустил от бесспорности своей правоты.
0nni вне форума Ответить с цитированием
Старый 06.01.2009, 18:08   #5
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Вы правы, она импортируется программой-клиентом, я просто в ней не могу открыть и прочитать файл. Вот и все проблема. AnsiString func(int i) - это функция принимает i т.е. она в программе исспользуется в цикле for. Например так ей передаються параметры:
for(int i=0;i<3;i++)
func(i);
profi вне форума Ответить с цитированием
Старый 06.01.2009, 23:48   #6
0nni
Форумчанин
 
Аватар для 0nni
 
Регистрация: 24.07.2008
Сообщений: 279
По умолчанию

Ты не удалил то что тебе писали когда ты создал проект dll?
Цитата:
//---------------------------------------------------------------------------
// 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
//---------------------------------------------------------------------------
Вот я и говорю что нельзя из dll вернуть строку вот небольшое обсуждение. Даже если ошибок пока нет в будущем появятся.
А насчет не открывается что пишет? "Connot Open file..." или что?
Попробуй написать абсолютный путь к txt файлу. А вообще это варварство в цикле столько раз создавать и удалять объекты.
И переделай функцию.
Сказал и загрустил от бесспорности своей правоты.

Последний раз редактировалось 0nni; 06.01.2009 в 23:55.
0nni вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Глобальный хук. Проблема с dll =\\ Zeraim Win Api 11 19.12.2008 00:18
Проблема с dll( DM_bite Помощь студентам 10 31.07.2008 16:05
И ещё проблема с DLL Altera Общие вопросы Delphi 7 25.06.2008 23:45
Проблема с путями к БД и *.dll honor БД в Delphi 5 25.01.2008 08:54