Перейти к содержимому

Invalid pointer operation как убрать в ворде

  • автор:

Invalid pointer operation как убрать в ворде

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

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

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

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

uses
SysUtils,
Classes,
Grids;

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

CXlsLabel: array[0..5] of Word = ($204, 0, 0, 0, 0, 0);

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

CXlsNumber: array[0..4] of Word = ($203, 14, 0, 0, 0);

begin
CXlsNumber[2] := ARow;
CXlsNumber[3] := ACol;
XlsStream.WriteBuffer(CXlsNumber, SizeOf(CXlsNumber));
XlsStream.WriteBuffer(AValue, 8);

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.

Почему вылазит ошибка Invalid Pointer Operation когда я использую в своей программе .dll?

Использую .dll в своей программе для обработки данных. Абсолютно весь код на Delphi 7 (.dll и программа) .
Функция самая простая в dll:
function InputControl (receive : string):string;
var
buf : string;
i : Integer;
begin
//Является ли команда Enter
i := Pos(‘:’, receive);
buf := Copy(receive, 1, i-1);
if buf = ‘Enter’
then
begin
Result := ‘Команда Enter’;
end;
end;

Но когда написал приложение и через extrenal вызываю библиотеку всё норм, а потом когда использую эту функцию библиотечную, программа выдаёт такую ошибку:
Invalid Pointer Operation
И что это за?!

Дополнен 11 лет назад

Вызываю на кнопке:
st := InputControl(‘Enter:GO 123);

Пока так для теста

Голосование за лучший ответ

В комментарии указывается на необходимость вставить ссылку на модуль ShareMem, если библиотека экспортирует длинные строки в параметрах обращения к подпрограммам или как результат функций. Эта ссылка должна быть первой как в предложении uses библиотеки, так и в uses файла проекта программы, которая использует эту библиотеку. Если подпрограммы библиотеки экспортируют строки ShortString или PChar, ссылаются на ShareMem не обязательно. Что бы не возникало недоразумений в своих библиотеках я рекомендую вместо типа String пользоваться PChar, а по необходимости конвертируйте типы функциями PChar (конветирует из String в PChar) и StrPas (конвертирует из PChar в String).

Invalid pointer operation как убрать в ворде

‘> Плавающие глюки. Как их отлавливать? , Написал программку — то работает, то не работает 🙁 Хочу довести до ум

  • Подписаться на тему
  • Сообщить другу
  • Скачать/распечатать тему

Сообщ. #1 , 20.07.07, 10:56

Здравствуйте!
Необходимо работать с текстом. До этого пользовался Ворд+Макросы.
Но хотелось что-бы быстрее и удобнее работало и решил написать
свой мини-блакнотик с нужными мне функциями. Написал, все что надо
делает. Но иногда глючит. Причем постоянные глюки и недоработки вроде
все нашел. Но иногда возникают глюки вроде на пустом месте
то ругнется «Invalid Pointer Operation», то упадет, то при выходе пишет
«Программа выполнила недопустимую операцию».
Как с таким бороться?
Как ловить эти плавающие глюки?

Ругается «Invalid Pointer Operation» на одной операции. У меня RichEdit,
чтобы заменить один текст на другой, выделяю текст в RichEdit курсором,
нажимаю горячие кнопки выполняется код.
Может что-то я коряво написал?

int SL=RE1->SelLength; //Кол-во символов
char *MyBuf=new char[SL]; //Буфер длиной SL
RE1->GetSelTextBuf(MyBuf, SL+1); //Получаю символы
AnsiString String=MyBuf, Bukva;
if (String.Length()>0)< //Удаляю символы конца строки. Trim отрезает не только их, но и пробелы. А пробелы могут быть нужны. Bukva=String[String.Length()]; if (Bukva=="\x0d" || Bukva=="\x0a")< String=String.SubString(1, String.Length()-1); if (String.Length()>0)< Bukva=String[String.Length()]; if (Bukva=="\x0d" || Bukva=="\x0a")< String=String.SubString(1, String.Length()-1); //позиционирую относитьельно главной формы Form2->Top=Form1->Top+Form2->Height;
Form2->Left=Form1->Left+Form1->Width-Form2->Width-50;
Form2->Edit1->Text=String; //Что заменить
Form2->Edit2->Text=String; //Чем заменить
delete MyBuf; //Удалю Буфер
void __fastcall TForm2::FormShow(TObject *Sender)
Form2->Edit2->SetFocus(); //При показе формы курсор на Edit2

Вроде и глючить то негде
То работает без проблем. То «Invalid Pointer Operation». Причем иногда если этот текст выделять по другому (не взять пробел, начать выделать не с начала строки, а с конца) все срабатывает.
Я уже не знаю что и думать

Сообщ. #2 , 20.07.07, 11:16

Рейтинг (т): 352
Цитата YuriiSuhanoff @ 20.07.07, 10:56
int SL=RE1->SelLength; //Кол-во символов
char *MyBuf=new char[SL];

Заменим на
char *MyBuf=new char[SL+1];
Сообщ. #3 , 20.07.07, 11:22
Спасибо! Попробую.
Сообщ. #4 , 23.07.07, 06:55

YuriiSuhanoff для проверки программ на наличие утечек удобно пользоваться CodeGuard-ом.

Его необходимо включить и перекомпилировать проект (внимание, полный ребилд). После того как прога отлажена и работает и нужен релиз для переноса на другой комп, нужно его отключить (иначе будешь тащить dll-ки CodeGuard-a вместе с exe-шником, кстати он еще довольно прилично притормаживает программу) и сделать опять полный ребилд.

Включается и выключается он в опциях проекта на вкладке CodeGuard:
меню Project->Options->вкладка CodeGuard->флажек CodeGuard Validation.

Настраивается он в другом месте: меню Tools->CodeGuard Configuration.

При отладке, в случае утечки, он тебе сообщает о пойманных утечках ресурсов, о том что ты залез за пределы массива и т.п. вещи, попробуй, очень удобная вещь.

Invalid pointer operation как убрать в ворде

Регистрация: 10.02.2014

Сообщений: 526

Invalid Pointer Operation не пойму откуда

Здравствуйте.
Есть процедура, формирующая TObjectList из другого TObjectList по определённой зависимости. Привязана к изменению ComboBoX (ComboBox1Change). Всё работает нормально пока работает программа. Но при закрытии программы вызывает ошибку «Invalid pointer operation». Никакую строчку в коде не высвечивает — просто говорит об ошибке, и всё. При этом если строку Add для формируемого TObjectList закомментировать — закрывается нормально. Раскомментировать — опять та же ошибка. Что за ерунда?
Сама процедура

procedure TForm1.OutOtdel(OtdName:String); var NewCont:TStringList; i:integer; begin SelPeoples.Clear; NewCont:=TStringList.Create; for i:=0 to Peoples.Count-1 do if (OtdName='Все') or ((OtdName<>'Все') and (Peoples[i].Departament=OtdName)) then begin NewCont.Add(Peoples[i].FIO); SelPeoples.Add(Peoples[i]); //если закомментировать - ошибка пропадает end; ListBox1.Items:=NewCont; NewCont.Free; end;
procedure TForm1.ComboBox1Change(Sender: TObject); begin OutOtdel(ComboBox1.Text); end;

Destroy формы

procedure TForm1.FormDestroy(Sender: TObject); begin SavePBToFile; SelPeoples.Free; Peoples.Free; Departaments.Free; end;

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *