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

Обновлено: 07.07.2024

Почему, алгоритмы, помещаемые в DLL, вдруг такое говорят.
Что я мог не так сделать.
Есть DLL, есть интерфейсный модуль. странно.
library crypt;

< Important note about DLL memory management: ShareMem must be the
first unit in your library"s USES clause AND your project"s (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. >

uses
SysUtils,
Classes,
CryptInt in "CryptInt.pas";

const
MultKey = 24908;
AddKey = 19045;

Всем спасибо за совет.

Совершенно верно. И так во всех случаях, когда используется динамическая память, которая может выделяться в одном программном модуле (например, в Exe), а освобождаться в другом (в DLL) - а все соглашения вызова, кроме cdecl, предусматривают освобождение параметров именно вызываемой стороной.

В частности, ShareMem нужен при передаче параметров - длинных строк или динамических массивов.

> а вот ShareMem что даст?

Exe и DLL компилируются, как два независимых проекта, которые ничего друг о друге не знают. ShareMem позволяет им иметь общий менеджер памяти, что и устраняет ошибки подобного рода.

> Если я выбираю PChar, то в проекте DLL слова типа string
> вообще запрещаются?

Нет, внутри DLL можно использовать string свободно.

> То есть сделать преобразование параметров из PChar в string,
> затем работать со string, затем обратно преобразовать string в
> pchar и дать result функции равный pchar нельзя?

Как строить функции со строками.

Если планируется использовать DLL только с Delphi-программами, то проблем нет - спокойно используем ShareMem, string и ни о чем не заботимся - все разрулит компилятор.

Если нет, то я бы не рекомендовал использовать функции типа PChar вообще. Процедуры для этого лучше. Примеров - целая куча в API. Скажем, GetWindowText:

int GetWindowText(
HWND hWnd, // handle of window or control with text
LPTSTR lpString, // address of buffer for text
int nMaxCount // maximum number of characters to copy
);

Как видим, сама функция возвращает не строку, а число. Строка же возвращается в буфере, КОТОРЫЙ ВЫДЕЛЯЕТСЯ ВЫЗЫВАЮЩЕЙ СТОРОНОЙ И ЕЮ ЖЕ ДОЛЖЕН ОСВОБОЖДАТЬСЯ.

Суть в следующем: программа генерирует задания, создает через Create панель на нее помещает radiogroup для вариантов ответа и label с текстом задания, созданные тоже через Create.
вот код:

вызывает эту процедуру по открытию неосновной формы OnShow

ошибку выдает именно на создании и удалении этих объектов.
В ЧЕМ ОШИБКА? __________________
Помощь в написании контрольных, курсовых и дипломных работ здесь

Invalid pointer operation при FreeMem
Вроде бы все правильно делаю но почему-то в 55 строке выдает ошибку &quot;Invalid pointer operation&quot;.


Ошибка invalid pointer operation при dispose
Вроде бы правильно освобождаю память, но программа запускается и как только жму enter сразу.


Ошибка при выполнении (invalid pointer operation)
Надо рандомезировать массив, первый раз получается, но когда нажимаю на кнопку второй раз выдает.

Invalid pointer operation при вызове процедуры
Лирическое отступление: Доброго всем времени суток. Сразу попрошу сильно на меня не ругаться, что.

Вот здесь для group в качестве parent назначается панель pan:
Это означает, что когда будет вызван деструктор панели tas[i].pan.Free, то прежде, чем самоуничтожиться, панель уничтожит все объекты, для которых она назначена, как parent. Т. е. при вызове tas[i].pan.Free сначала будет уничтожен tas[i].group, а затем - tas[i].pan. Поэтому если после tas[i].pan.Free вызвать tas[i].group.Free, то возникнет ошибка, потому что tas[i].group уже не существует. Именно эта ситуация и возникает в коде, где вызываются деструкторы:
Возможно, что и это место корявое, но программа выдает ошибку первый раз еще при создании компонентов
Я думал, может это из-за объявление компонентов через record а не через class. Хотя и это не помогает вызывает эту процедуру по открытию неосновной формы OnShow Надо перенести вызов в обработчик события OnCreate. Потому что после создания формы событие OnShow может произойти несколько раз. Например, если для формы выполнить FormX.Visible := False, а потом: FormX.Visible := True, то возникнет событие OnShow. Если, соответственно, несколько раз будет выполнен код создания элементов, то произойдут утечки памяти - потому, что ссылки на прежние объекты будут потеряны. Это не является причиной ошибки Invalid Pointer Operation, но такие исправления всё же надо сделать.
Более надёжен вот такой код:

В этом коде присутствует защита от повторного создания объектов и утечек памяти. При этом надо иметь в виду, что перед началом работы элементы массива tas должны быть инициализированы значениями NIL (т. е., обнулены: nil = Pointer(0)). Если tas объявлен в модуле на глобальном уровне или является полем класса, то он будет инициализирован нулями автоматически.

Что касается ошибки Invalid Pointer Operation, для выяснения причин нужно другие участки кода проверить - окружение, где происходит вызов процедуры создания объектов и т. д..

где:
cap:array of real;

Прочитал в одной статье, что так массивы уничтожаються (aka Dispose для указателей в Pascal), но нифига не
помогает. что я не сделал? Где руки выпрямлять?

а зачем ему nil присваивать. он и сам уничтожится.

2 wicked
Нифига. хоть присваивай nil, хоть не присваивай. все равно "Invalid pointer operation"

2 GLFox и это тож пробовал. те же яйца только в профиль.

А еще какие поинтеры используешь?

Никаких. в том то и дело. Это единственный DynamicArray во всей проге.

← →
Anatoly Podgoretsky © ( 2004-11-19 20:20 ) [7]

У тебя ошибка в программе.


> Если динаические массивы не использовать,

Второй наводящий вопрос: а как ты их используешь?

← →
Anatoly Podgoretsky © ( 2004-11-19 20:41 ) [12]

VitGun © (19.11.04 20:22) [8]
Да, да именно так, ошибка при работе с динамическими массивами, вот теперь когда способился привести хоть чуть кода, то это уже стало не предположением, а истиной. Ты выходишь за пределы массива, а контроль за этим явно отключил.
Для начала срочно в настройки компилятор, проштудировать их и до тех пор ни строчки кода или же пиши без ошибок.

← →
Anatoly Podgoretsky © ( 2004-11-19 20:43 ) [13]

begin. end © (19.11.04 20:40) [11]
Ну сдесь исправит, так в другом месте вылезет, надо не заплатки, а как минимум включить контроль за границами.

← →
Anatoly Podgoretsky © ( 2004-11-19 20:45 ) [14]

Сделай для начала так
SetLength(,2) затем на бумажке пишешь, вручную прокручивая цикл
I = ?
..
I = ?

и считаешь количество строк, затем сравниваешь с количеством строк массиса


> [13] Anatoly Podgoretsky © (19.11.04 20:43)

Ну это само собой, а также, ИМХО, лучше пользоваться в таких случаях не конкретной переменной, а High(cap).

2 Anatoly Podgoretsky

Уж извините..нет. За пределы массива я не выпадаю. Сие мне известно и контроль включен. Ошибка появляется при ЗАКРЫТИИпрограммы, а не во время выполнения.

for i:=0 to len do
begin
cap[i]:=something;
end;

Данный код не может быть верным! Индексы в динамических массивах начинаются с НУЛЯ и заканчиваются на Length(YourArray)-1.

← →
Anatoly Podgoretsky © ( 2004-11-19 20:56 ) [21]

VitGun © (19.11.04 20:47) [16]
Ой не надо отпираться от горячего, ты бы уж не проводил свой код, а теперь краснеть надо за продолжающее развешивание лапшию
Кроме того ты выполнил домашнее задание в 14, сколько у тебя получилось?

← →
Anatoly Podgoretsky © ( 2004-11-19 20:58 ) [22]

begin. end © (19.11.04 20:45) [15]
Ну это способ писать без ошибок, особенно если к ней добавить еще и Low


> [16] VitGun © (19.11.04 20:47)

ты может быть сначала вникнешь прежде чем сопротивляться. не веди себя как ламер.

Ошибка: Invalid pointer operation

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

Ошибка: Invalid pointer operation
procedure TForm1.Button2Click(Sender: TObject); var i, n : Integer; Point : array of.

Ошибка : Invalid pointer operation
При работе программы возникает данная ошибка ! Возможно она появляется при создании массива вот.

Завершить процесс winword.exe

Нажмите Ctrl+Shift+Esc, чтобы открыть диспетчер задач. Далее найдите процесс WINWORD.EXE и щелкните по нему правой кнопкой мыши, после чего выберите завершить. Затем перезапустите приложение Office.

снять задачу WinWord

Запуск Word без макросов и дополнительных функций

Загрузите Word без макросов и посмотрите исправляет ли это ошибку. Нажмите сочетание клавиш Win + R и введите winword /m .

Запуск Word без макросов win+r

Чтобы Word не загружал свои надстройки, введите winword /a

Запуск Word без надстроек win+r

Сбросить запись реестра Word по умолчанию

Сначала вам нужно завершить процесс WINWORD.EXE в диспетчере задач. Далее нажмите обратно Win+R и введите winword /r .

сбросить значения реестра Word win+r

Сканирование на вирусы

Вирусы могут быть проблемой и выдавать ошибку. Воспользуйтесь антивирусным сканером , чтобы проверить систему на вирусы. Процесс WINWORD.EXE должен находиться на своем законном пути. Если он этот процесс находится по другому пути, то это вирус.

  • C:\Program Files (x86)\Microsoft Office\root\Office16

Вы можете нажать на этот процесс в диспетчере задать правой кнопкой мыши и выбрать "Расположение файла".

расположение файла WinWord.exe

Ремонт офиса

Поврежденный пакет Office может выдавать различные ошибки. Откройте "Панель управления" > "Удаление программ", найдите Microsot Office и выделите его одним нажатием мыши, после чего нажмите сверху на кнопку "Изменить". Будет запущен процесс восстановления программы, где выберите "Восстановление по сети" и далее следуйте инструкциям на экране.

Читайте также: