Приветствую Вас. Подскажите. почему может вылетать ошибка 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.
|
|