Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.01.2010, 16:07   #1
s2dentishe
Пользователь
 
Регистрация: 13.11.2009
Сообщений: 70
По умолчанию загрузка библиотеки DLL

Добрый день. Такая проблема, загрузка происходит, а вызов процедуры производит к ошибке
вот текст библиотеки
library Kodirovanie;

{ Important ... }

uses
SysUtils,
Classes;
Type
TmasS=array[1..255,1..255] of char;
var
masS:TmasS;
function Kodirovka(text,parol:String):String ; StdCall;
var
i, schet: integer;
begin
schet:=1;
for i:=1 to Length (text) do begin
if schet>length(parol) then schet:=1;
text[i]:=masS[(ord (parol[schet])),ord(text[i])];
schet:=schet+1;
end;
result:=text;
end;
function Dekodirovka(text,parol:String):Stri ng; StdCall
var
i,j, schet: integer;
begin
schet:=1;
for i:=1 to Length (text) do begin
if schet>length(parol) then schet:=1;
for j:=1 to 255 do begin
if masS[(ord (parol[schet])),j]=text[i] then begin text[i]:=masS[1,j];break; end;
end;
schet:=schet+1;
end;
result:=text;
end;

exports
Dekodirovka, Kodirovka;

{$R *.res}

begin
end.

вот код в программе
Type
TmasS=array[1..255,1..255] of char;
var
Form1: TForm1;
masS:TmasS;
H: THandle=0;
Kodirovka: function(text,parol:String):String; StdCall;
Dekodirovka: function(text,parol:String):String; StdCall;
...
...
...
procedure TForm1.Button1Click(Sender: TObject);
var
parol_v:string;
begin
parol_v:=Form1.Edit1.Text;
Form1.Memo1.Text:=Kodirovka(Memo1.T ext,parol_v);//эта строчка вызывает ошибку
end;

Вот ошибка
Project Project1.exe raised exception cIass EInvaIidPointer with message 'InvaIid pointer operation' ,
Process stopped. Use Step or Run to continue.

Вот текст динамической загрузки библиотеки
H:=LoadLibrary('Kodirovanie.dll');
if H<>0 then
begin
Kodirovka:=GetProcAddress(H,'Kodiro vka');
Dekodirovka:=GetProcAddress(H,'Deko dirovka');
end
else ShowMessage('Не удалось загрузить DLL!');
s2dentishe вне форума Ответить с цитированием
Старый 10.01.2010, 16:08   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

вы читали комментарий пустой ДЛЛ?
про тип string
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 10.01.2010, 16:27   #3
s2dentishe
Пользователь
 
Регистрация: 13.11.2009
Сообщений: 70
По умолчанию

А можете посоветовать, что делать в этой ситуации?
s2dentishe вне форума Ответить с цитированием
Старый 10.01.2010, 16:34   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

либо PChar либо как там написано.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 10.01.2010, 17:00   #5
s2dentishe
Пользователь
 
Регистрация: 13.11.2009
Сообщений: 70
По умолчанию

Использую библиотеку BorlndMM
по выходу из приложения, после освобождения памяти происходит ошибка
"Исключение неизвестное программное исключение(0х0eedfade) в приложении по адресу 0x7c812a7b"
s2dentishe вне форума Ответить с цитированием
Старый 10.01.2010, 17:06   #6
AlexanderKs
Пользователь
 
Регистрация: 26.02.2009
Сообщений: 60
По умолчанию

Через PChar:

Код:
library Kodirovanie;

{ Important ... }
...

function Kodirovka(text,parol:PChar):PChar ; StdCall;
...
begin
schet:=1;
  for i:=0 to Length(text) do begin
    ...
  end;
result:=text;
end;

function Dekodirovka(text,parol:PChar):PChar; StdCall
...
begin
schet:=1;
  for i:=0 to Length(text) do begin
    ...
  end;
result:=text;
end;

exports
Dekodirovka, Kodirovka;

{$R *.res}

begin
end.

// программа
Type
TmasS=array[1..255,1..255] of char;
var
...
Kodirovka: function(text,parol:PChar):PChar; StdCall;
Dekodirovka: function(text,parol:PChar):PChar; StdCall;
...

procedure TForm1.Button1Click(Sender: TObject);
var
parol_v:string;
begin
...
Form1.Memo1.Text:=Kodirovka(PChar(Memo1.Text),PChar(parol_v));
end;
AlexanderKs вне форума Ответить с цитированием
Старый 10.01.2010, 17:18   #7
s2dentishe
Пользователь
 
Регистрация: 13.11.2009
Сообщений: 70
По умолчанию

PChar мне не подойдет. Там свои нюансы. Подскажите лучше какие процедуры использовать для работы с памятью при загрузке и выгрызет DLL из модуля ShareMem
s2dentishe вне форума Ответить с цитированием
Старый 10.01.2010, 17:48   #8
s2dentishe
Пользователь
 
Регистрация: 13.11.2009
Сообщений: 70
По умолчанию

Подскажите, пожалуйста, как изменить менеджер памяти
s2dentishe вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблемы с подключением dll библиотеки Tan4ik Помощь студентам 7 01.03.2010 21:02
разработка DLL библиотеки tibult Фриланс 5 03.12.2008 13:23
Библиотеки Dll ivanesky Общие вопросы Delphi 9 10.03.2008 10:42
DLL библиотеки Altera Помощь студентам 2 06.02.2008 06:13
Безопасность и DLL библиотеки PAVEL315 Безопасность, Шифрование 3 10.03.2007 20:31