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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.12.2010, 17:25   #1
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию Ошибка работы с памятью

В DLL:
Код:
 Procedure IntToStr2(I : Integer; Width : Integer; Var Res : PChar); StdCall; Export;
 Var
  S : String;
 Begin
  Str(I, S);
  If Width > 0 Then
   While Length(S) < Width Do
    S := INTFILLER + S;
  Res := PChar(S);
 End;
Код:
Procedure WriteLogB(Action : PChar; Res : Boolean); StdCall; Export;
 Var
  LocalTime : TSystemTime;
  PC1       : PChar;
  PC2       : PChar;
  PC3       : PChar;
  PC4       : PChar;
  PC5       : PChar;
  PC6       : PChar;
  PC7       : PChar;
  PCB       : PChar;
 Begin
  ZeroMemory(@LocalTime, SizeOf(LocalTime));
  GetLocalTime(LocalTime);
  IntToStr2(LocalTime.wDay         , LENGTH_DAY         , PC1);
  IntToStr2(LocalTime.wMonth       , LENGTH_MONTH       , PC2);
  IntToStr2(LocalTime.wYear        , LENGTH_YEAR        , PC3);
  IntToStr2(LocalTime.wHour        , LENGTH_HOUR        , PC4);
  IntToStr2(LocalTime.wMinute      , LENGTH_MINUTE      , PC5);
  IntToStr2(LocalTime.wSecond      , LENGTH_SECOND      , PC6);
  IntToStr2(LocalTime.wMilliseconds, LENGTH_MILLISECONDS, PC7);
  BoolToStr(Res, PCB);
  WriteLn(LOG_File, PC1 + DIVIDER_DAY     +
                    PC2 + DIVIDER_MONTH   +
                    PC3 + DIVIDER_EMPTY   +
                    PC4 + DIVIDER_HOUR    +
                    PC5 + DIVIDER_MINUTE  +
                    PC6 + DIVIDER_SECONDS +
                    PC7 + DIVIDER_EMPTY   +
                     MARK_ACTION + PChar(Action)  + DIVIDER_DOT + DIVIDER_EMPTY +
                     MARK_RESULT + PCB + DIVIDER_DOT);
 End;
В EXE :

Код:
 Procedure WriteLog(Action : PChar; Res : Boolean);                                            StdCall; External 'Gfur.dll' Name 'WriteLogB';
Код:
WriteLog('Let`s check it', TRUE);
Результат плох:
Код:
828.828.828 828:828:828.828 ACTION: Let`s check it. RESULT: True.
А раньше результат был правильным, когда я поступал так:
Function <FuncName>:PChar;
Сказали, что будут утечки, сделал так:
Procedure <FuncName>(Res : PChar);
(На примере IntToStr2 видно, где проходили границы прошлого варианта).

Как сделать рабочим?
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 03.12.2010, 20:41   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а FreeMem не сделать как я предлагал?
зачем все перестраивать-то?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 03.12.2010, 21:04   #3
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Код:
 Procedure WriteLogB(Action : PChar; Res : Boolean); StdCall; Export;
 Var
  LocalTime : TSystemTime;
  PC1       : PChar;
  PC2       : PChar;
  PC3       : PChar;
  PC4       : PChar;
  PC5       : PChar;
  PC6       : PChar;
  PC7       : PChar;
  PCB       : PChar;
 Begin
  ZeroMemory(@LocalTime, SizeOf(LocalTime));
  GetLocalTime(LocalTime);
  IntToStr2(LocalTime.wDay         , LENGTH_DAY         , PC1);
  ShowMe(PC1);
  IntToStr2(LocalTime.wMonth       , LENGTH_MONTH       , PC2);
  ShowMe(PC2);
  IntToStr2(LocalTime.wYear        , LENGTH_YEAR        , PC3);
  ShowMe(PC3);
  IntToStr2(LocalTime.wHour        , LENGTH_HOUR        , PC4);
  ShowMe(PC4);
  IntToStr2(LocalTime.wMinute      , LENGTH_MINUTE      , PC5);
  ShowMe(PC5);
  IntToStr2(LocalTime.wSecond      , LENGTH_SECOND      , PC6);
  ShowMe(PC6);
  IntToStr2(LocalTime.wMilliseconds, LENGTH_MILLISECONDS, PC7);
  ShowMe(PC7);
  BoolToStr(Res, PCB);
  WriteLn(LOG_File, PC1 + DIVIDER_DAY     +
                    PC2 + DIVIDER_MONTH   +
                    PC3 + DIVIDER_EMPTY   +
                    PC4 + DIVIDER_HOUR    +
                    PC5 + DIVIDER_MINUTE  +
                    PC6 + DIVIDER_SECONDS +
                    PC7 + DIVIDER_EMPTY   +
                     MARK_ACTION + PChar(Action)  + DIVIDER_DOT + DIVIDER_EMPTY +
                     MARK_RESULT + PCB + DIVIDER_DOT);
 End;
ShowMe показывает нормальные, а WriteLn записывает бред
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 03.12.2010, 21:28   #4
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Ошибка локализована Причина была в том, что в WriteLn пришла контенкация PChar строк. А это - зло. Отдельно нормально, а вот с +-м идет бредятина. Внутренний вызов заменил на String и все нормально.

Спасибо Goodwin!
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 04.12.2010, 06:45   #5
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Ох.

1. Всегда работайте со String, а приведение к PChar делайте в последний момент.

2. Если вы хотите вернуть строку из функции в DLL, то проще всего использовать WideString.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функция с памятью. the_deer_one Общие вопросы C/C++ 3 27.08.2010 09:45
Работа с памятью GrihaI Общие вопросы C/C++ 0 14.05.2010 18:18
Вышла ошибка во время работы ... HAMMAN Microsoft Office Excel 6 25.03.2010 11:49
Ошибка работы с blob полем, в похожем проекте все работает Lokos БД в Delphi 6 25.02.2010 08:17
Проблема с памятью в С++ rJIaBkoM Помощь студентам 1 14.06.2008 14:25