Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка Invalid Pointer operation при закрытии прог 
:(
    Опции темы
Desperate
Дата 27.2.2011, 00:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: нет
Всего: -1



Приветствую Вас.

Подскажите. почему может вылетать ошибка Invalid Pointer operation, при запуске скомпилированного то "обратилась к недоступной памяти и не может быть реад", то не известное исключение. Хотя сама программа отлично работает.

Эта ошибка стала вылетать, когда я решил некоторые функции собрать в DLL, когда все в куче было, работало без ошибок.
Привожу код DLL, может ее написал коряво...

Код


library myfuncpk;


uses
  SysUtils,
  Classes,
  Grids;

{$R *.res}
Function SearchStr( Str, SubStr:string):boolean; stdcall;  // функция поиска подстроки в строке, находит первое вхождение и возвращает True
Var LnStr:integer;
   swap:string;
    i,j,s:integer;
    
begin
   Result:=false;
   LnStr:=Length(Str);
   j:=Length(Substr);
   i:=1;
   swap:='';

If Str<>'' then
 If SubStr<>'' then
  begin
   Repeat
     for s:= 0 to j-1 do swap:=swap+str[s+i];

      if swap=substr
          then result:=true
       else
          begin
           swap:='';
           i:=i+1;
          end;
    until (i+j-1>LnStr) or (result<>false);
  end;
end;

function LowCase(ch: CHAR): CHAR; stdcall; // Функция переводит символ в нижний регистр (работает для Англ и Рус символов)
begin  
  case ch of  
    'A'..'Z': LowCase := CHR(ORD(ch) + 32);
    'А'..'Я': LowCase := CHR(ORD(ch) + 32);  
  else
    LowCase := ch;   
  end;   
end;   

Function LowStr(str:string): string; stdcall; // функция переводит строку в нижний регистр
var i:integer;
    str2:string;
begin
 str2:='';
   For i:=1 to Length(str) do str2:= str2+ LowCase(str[i]);
 result:=str2;
end;

procedure XlsWriteCellLabel(XlsStream: TStream; const ACol, ARow: Word;   // процедура создания  строкового типа ячейки xls при сохранении таблицы
  const AValue: string);  stdcall;
var  
  L: Word;   
const  
  {$J+}   
  CXlsLabel: array[0..5] of Word = ($204, 0, 0, 0, 0, 0);   
  {$J-}   
begin  
  L := Length(AValue);   
  CXlsLabel[1] := 8 + L;   
  CXlsLabel[2] := ARow;   
  CXlsLabel[3] := ACol;   
  CXlsLabel[5] := L;   
  XlsStream.WriteBuffer(CXlsLabel, SizeOf(CXlsLabel));   
  XlsStream.WriteBuffer(Pointer(AValue)^, L);   
end;   

procedure XlsWriteCellNumber(XlsStream: TStream; const ACol, ARow: Word;    // процедура создания  вещественного(так же можно и тип Int) типа ячейки xls при сохранении таблицы
  const AValue: double); stdcall;
const  
  {$J+}
   CXlsNumber: array[0..4] of Word = ($203, 14, 0, 0, 0);
  {$J-}   
begin  
  CXlsNumber[2] := ARow;
  CXlsNumber[3] := ACol;
  XlsStream.WriteBuffer(CXlsNumber, SizeOf(CXlsNumber));    
  XlsStream.WriteBuffer(AValue, 8);

end;   

function DaysOfMonth(mm, yy: Integer): Integer; stdcall; // функция возвращает кол-во дней в месяце по введеному месяцу и году. Учитывает так же высок или не высок год!!!
begin 
  if mm = 2 then  
  begin 
    Result := 28; 
    if IsLeapYear(yy) then Result := 29; 
  end  
  else  
  begin 
    if mm < 8 then  
    begin 
      if (mm mod 2) = 0 then 
        Result := 30 
      else 
        Result := 31; 
    end  
    else  
    begin 
      if (mm mod 2) = 0 then 
        Result := 31 
      else
        Result := 30;
    end; 
  end; 
end;

Procedure TableClear(table:TstringGrid; RowC_Table, ColC_Table:integer); stdcall; //процедура чистки таблицы и установка кол-ва строк и столбцов
var i,j:integer;
 Begin
 For i:=1 to Table.RowCount-1 do
   For j:=0 to Table.ColCount-1 do
    Table.Cells[j,i]:='';
 Table.RowCount:=RowC_Table;
 Table.ColCount:=ColC_Table;
 Table.Refresh;
 end;


 exports
      SearchStr index 1,
      LowCase index 2,
      LowStr index 3,
      XlsWriteCellLabel index 4,
      XlsWriteCellNumber index 5,
      DaysOfMonth index 6,
      TableClear index 7;
begin
end.


PM MAIL   Вверх
northener
Дата 27.2.2011, 03:05 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 12
Всего: 20



Цитата(Desperate @  27.2.2011,  00:20 Найти цитируемый пост)
Подскажите. почему может вылетать ошибка

Ну самое первое и самое банальное.
Ты читал комментарий, который дельфи автоматически создает при создании нового Dll-проекта? 
Очевидно не читал.


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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