Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
10 / 7 / 4
Регистрация: 08.12.2013
Сообщений: 165
1

Функция в DLL, Invalid pointer operation

28.09.2014, 13:16. Просмотров 892. Ответов 5
Метки нет (Все метки)


Всем доброго дня!
Есть такая проблема: имеется dll с тремя функциями, которые будут экспортироваться:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
library funcLib;
uses
  SysUtils,
  Classes;
 
{$R *.res}
//zamenit' pervuju bukvu kazhdogo slova
function firstLet(str:string):string;stdcall;
var
  i:Integer;
  strLength:integer;
begin
  strLength:=Length(str);
  SetLength(str, strLength);
   //esli pervoe slovo s malekoi bukvu -- zamenim ego
   if (Ord(str[1]) >= 97) and (Ord(str[1]) <= 122) then
         str[1]:=Chr((Ord(str[1]))-32);
   //poisk pozicii nachala kazhdogoslova
   for i:=2 to strLength do
   begin
       if str[i] = ' ' then
       begin
         if (Ord(str[i+1]) >= 97) and (Ord(str[i+1]) <= 122) then
         str[i+1]:=Chr(Ord(str[i+1])-32);
       end;
    end;
   firstLet:=str;
end;
//iz propisnux v strochnue
function Atoa(str:string):string;stdcall;
var
  i:Integer;
  strLength:integer;
begin
  strLength:=Length(str);
  SetLength(str, strLength);
  for i:=0 to strLength do
  begin
    if (Ord(str[i]) >= 65) and (Ord(str[i]) <= 90) then
    str[i]:=Chr(Ord(str[i])+32);
  end;
  Atoa:=str;
end;
//vse v strochnue
function getCaps(str:string):string;stdcall;
var
  i:Integer;
  strLength:integer;
begin
  strLength:=Length(str);
  SetLength(str, strLength);
  for i:=1 to strLength do
  begin
    if (Ord(str[i]) >= 97) and (Ord(str[i]) <= 122) then
         str[i]:=Chr((Ord(str[i]))-32);
  end;
  getCaps:=str;
end;
exports
firstLet,
Atoa,
getCaps;
 
begin
end.
Задачи функций таковы:
1) Преобразование всех букв символьной строки в строчные.
2) Преобразование всех первых букв слов, входящих в состав символьной строки, в прописные.
3) Преобразование всех букв символьной строки в прописные.

И есть программа, которая импортирует эти функции:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    edtbefore1: TEdit;
    edtbefore2: TEdit;
    edtbefore3: TEdit;
    btn1: TButton;
    btn2: TButton;
    btn3: TButton;
    lbl1: TLabel;
    lbl2: TLabel;
    lbl3: TLabel;
    edtafter1: TEdit;
    edtafter2: TEdit;
    edtafter3: TEdit;
    procedure btn1Click(Sender: TObject);
    procedure btn2Click(Sender: TObject);
    procedure btn3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
 
 
implementation
 
{$R *.dfm}
//Import funkciy
function  Atoa(str:string):string;stdcall; external 'funcLib.dll';
function  firstLet(str:string):string;stdcall; external 'funcLib.dll';
function  getCaps(str:string):string;stdcall; external 'funcLib.dll';
 
procedure TForm1.btn1Click(Sender: TObject);
var
  str:string;
begin
  str:=edtbefore1.Text;
  edtafter1.Text:=Atoa(str);
end;
 
procedure TForm1.btn2Click(Sender: TObject);
var
  str:string;
begin
  str:=edtbefore2.Text;
  edtafter2.Text:=firstLet(str);
end;
 
procedure TForm1.btn3Click(Sender: TObject);
var
  str:string;
begin
  str:=edtbefore3.Text;
  edtafter3.Text:=getCaps(str);
end;
 
end.
По нажатию кнопок (btn1,btn2,btn3) переменной str присваивается текстовое значение из эдита, производится трансформация и результат выводится в другой эдит.
Код функций проверен отдельно, все работает отлично. Но в этой программе по нажатию на кнопку, вылазит ошибка "Invalid pointer operation". НО когда я нажимаю на "Ок" функция нормально выполняется, все трансформируется и выводится в эдит! То есть, все нормально работает, но появляется эта ошибка!
Что это такое и как это исправить?
Заранее спасибо за ваши подсказки!

З.Ы: поиск юзал, гугл юзал, для себя ничего полезного не нашел. Вроде и длину строки вначале задал, и за пределы массива вылазить не должно. Что еще делать я не знаю
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.09.2014, 13:16
Ответы с готовыми решениями:

invalid pointer operation
function MathFunc.MyMath(m:integer):integer; var i1,i,n,i2,i3:integer; b,g,a:mas;...

Invalid pointer operation
Доброго времени суток! Есть программа тестирования, которая работает с двумя типами вопросов : -...

Invalid pointer operation
Создал программу для поиска седловых точек в матрице (если элемент матрицы максимален в своей...

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

5
Модератор
3475 / 2599 / 740
Регистрация: 19.09.2012
Сообщений: 7,965
28.09.2014, 18:34 2
Лучший ответ Сообщение было отмечено Александр_Алекс как решение

Решение

Цитата Сообщение от Александр_Алекс Посмотреть сообщение
поиск юзал, гугл юзал
В данном случае искать ничего не надо было:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
library Project1;
 
{ 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
1
135 / 134 / 65
Регистрация: 15.05.2012
Сообщений: 512
28.09.2014, 18:48 3
альтернативы widestring, shortstring и т.д. Или как писал FIL...
p.s. А так в DLL не кто не использует string)
1
10 / 7 / 4
Регистрация: 08.12.2013
Сообщений: 165
28.09.2014, 19:58  [ТС] 4
Мда)
Использовал ShortString и все ок, всем спасибо.
0
пофигист широкого профиля
4294 / 2813 / 797
Регистрация: 15.07.2013
Сообщений: 16,321
29.09.2014, 01:49 5
Цитата Сообщение от wendstor Посмотреть сообщение
альтернативы widestring, shortstring и т.д.
Интересно что подразумевается под "и т.д."
0
135 / 134 / 65
Регистрация: 15.05.2012
Сообщений: 512
29.09.2014, 11:49 6
Цитата Сообщение от northener Посмотреть сообщение
Интересно что подразумевается под "и т.д."
Хоть собственный тип...
Delphi
1
2
type
SmallString = string[32];
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.09.2014, 11:49

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Ошибка: invalid pointer operation
Привет не могу вытащить настройки CheckBox1 из ini файла если CheckBox1.Checked:=true то выдает ...

Ошибка: Invalid pointer operation
Здравствуйте. Пытаюсь вставить картинку в программу через компонент Image. После вставки, при...

Ошибка Invalid pointer operation
Type TICQContact = record uin: string; pwd: string; end; var Form2: TForm2;...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.