Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.11.03;
Скачать: CL | DM;

Вниз

Как проще всего преобразовать Unit2 в компонент ?   Найти похожие ветки 

 
Кен ©   (2003-10-20 03:00) [0]

Хочу поделиться с другими своими функциями и процедурами, но нехочу обножать их исходный код, поэтому пытаюсь перевести Unit2 в DLL, а у меня не получается.

Вот Unit2 :
unit Unit2;

interface

uses
SysUtils, Classes, ValEdit, Dim;

function Test1(sourcestr: TStrings): Boolean;

implementation

function Test1(sourcestr: TStrings): Boolean;
var
i : Integer;
begin
if sourcestr.Count > 0 then begin
sourcestr[0] := LeftTrim(sourcestr[0])+" ! ";
Result := True;
end else begin
Result := False;
end;
end;

end.


Вот так я его преобразую в DLL :
library lub1;

uses
SysUtils, Classes, ValEdit, Dim;

{$R *.res}

function Test2(sourcestr: TStrings; TextNumber: Integer): Boolean; export; stdcall;
var
i : Integer;
begin
if sourcestr.Count > 0 then begin
sourcestr[0] := sourcestr[0]+" ! ";
Result := True;
end else begin
Result := False;
end;
end;

exports
Test2;

begin
end.


Прописываю функцию из dll в программу вот так :
function Test2(sourcestr: TStrings): Boolean; far; stdcall; external "lub1.dll";

В результате, если вызываю функцию из Unit2,
if Unit2.Test1(Memo1.Lines) then beep;
то всё работает нормально,

А если вызываю туже самую функцию из dll, то программа вылетает с ошибкой :
procedure TForm1.Button2Click(Sender: TObject);
begin
if Test2(Memo1.Lines) then beep;
end;


Вопрос мастерам, в чём заключается проблема и как правильно конвертировать Unit2 в dll ?


 
Кен ©   (2003-10-20 03:03) [1]

!!! В заголовке ошибка. Не в компонент, а конечно же в DLL. !!!
Просто очень поздно уже.


 
Palladin ©   (2003-10-20 03:12) [2]

поставь модуль ShareMem в секции Uses в файле проекта и в файле библиотеки самым первым...


 
Кен ©   (2003-10-20 03:44) [3]


> Palladin © (20.10.03 03:12) [2]
> поставь модуль ShareMem в секции Uses в файле проекта и
> в файле библиотеки самым первым...

Поставил.
Длл теперь выглядти так :
library lub1;

uses
ShareMem, SysUtils, Classes, ValEdit, Dim;
...


Файл проекта, то есть Unit1 теперь начинается так :
unit Unit1;

interface

uses
ShareMem, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;
...


Я правильно написал ?

В результате программа запускается, но при вызове DLL вылетает и показывает окошко дебаггера.
Попытался запустить программу без Дельфи, в результате на экране у меня появилось окно с надписью :
Программа Testdll вызвала ошибку LUB1.DLL.
Программа Testdll будет закрыта.

Если эта ошибка будет повторяться,
попробуйте перезагрузить компьютер.

И самое интересное, что закрыть это окно невозможно. Стоит его закрыть и оно появится снова. Нажимаю три кнопки, чтобы снять задачу, но окно процессов не появляется !!!
Хакеру на заметку.

Что делать ?


 
Opera ©   (2003-10-20 03:50) [4]

Вот как делаю я
Программа
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;

type
TForm1 = class(TForm)
Label1: TLabel;
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

procedure RunStopHook(State : Boolean)
stdcall; external "diks.dll" index 1;

dll

library hackpass;

uses Windows, Messages;
var
SysHook : HHook = 0;
Wnd : Hwnd = 0;

procedure RunStopHook(State : Boolean) export; stdcall;
begin
end;

exports RunStopHook index 1;
begin
end.


 
Palladin ©   (2003-10-20 04:04) [5]


> Кен © (20.10.03 03:44) [3]

Я тебе где сказал поставить? А ты где поставил?


 
dva ©   (2003-10-20 04:21) [6]

Вот как объявлена функция у тебя в DLL:
function Test2(sourcestr: TStrings; TextNumber: Integer): Boolean; export; stdcall;
А вот как она же объявлена в .EXE:
function Test2(sourcestr: TStrings): Boolean; far; stdcall; external "lub1.dll";
Как видишь, есть небольшая разница. Но ее хватает, чтобы при вызове в стек был помещен второй параметр. Об этом параметре и не подозревают в DLL и оставляют на стеке при завершении Test2. А .EXE считает, что отработавшая функция "подчистила за собой", ведь вызов был stdcall, и с разбегу влетает в ... TextNumber. А уж какой командой его воспримет процессор - нам не ведомо...

В случае с Test2 компилируемой в .EXE - такого не происходит. Потому как второй параметр передается через регистр и не требует очистки стека при возврате.

Вот как все просто бывает...


 
Кен ©   (2003-10-20 04:33) [7]


> Opera © (20.10.03 03:50) [4]

Отличие только в index 1. Попробовал, но не помогло.

Тут дело скорее в строке
sourcestr[0] := sourcestr[0]+" ! ";
Когда мы передаём в Длл указатель на Memo1.Lines и Длл приписывает к строке восклицательный знак. Видно что то с памятью не то происходит. Но что конкретно и как исправить непонятно.


 
Кен ©   (2003-10-20 04:53) [8]


> dva © (20.10.03 04:21) [6]
> Вот как объявлена функция у тебя в DLL:
> function Test2(sourcestr: TStrings; TextNumber: Integer):
> Boolean; export; stdcall;
> А вот как она же объявлена в .EXE:
> function Test2(sourcestr: TStrings): Boolean; far; stdcall;
> external "lub1.dll";

Признаю. Моя ошибка. Просто я много эксперементировал с этой фигнёй вставляя разные параменры. Но если в dll и прописать правильное объявление
function Test2(sourcestr: TStrings): Boolean; export; stdcall;
, то ошибка всё равно остаётся.


 
Спрашивающий_   (2003-10-20 07:14) [9]

>Хочу поделиться с другими своими функциями и процедурами,
без исходников вряд ли кто в серьез воспримит, не зная что внутри.


 
Кен ©   (2003-10-20 07:29) [10]


> Спрашивающий_ (20.10.03 07:14) [9]
> >Хочу поделиться с другими своими функциями и процедурами,
> без исходников вряд ли кто в серьез воспримит, не зная что
> внутри.

Если б не просили, не делал бы.


 
Anatoly Podgoretsky ©   (2003-10-20 08:32) [11]

И ты хочешь сказать, что для этого надо делать ДЛЛ?
Рано тебе еше длл заниматься.


 
Кен ©   (2003-10-21 02:21) [12]


> Anatoly Podgoretsky © (20.10.03 08:32) [11]
> Рано тебе еше длл заниматься.

И это всё, чему может научить ваше поколение молодёжь ?


> Palladin © (20.10.03 03:12) [2]
> поставь модуль ShareMem в секции Uses в файле проекта и
> в файле библиотеки самым первым...

Не знаю почему, но когда вписываю ShareMem в юзез, у меня при закрытии программы начинает выдаваться ошибка ИнвалидПоинтер.
Причём даже если вписать ShareMem в абсолютно пустую программу.
Дельфи 7. Что может глючить ?


 
Palladin ©   (2003-10-21 02:50) [13]

внимательно прочитать то что я сказал


 
Кен ©   (2003-10-21 05:51) [14]


> Palladin © (21.10.03 02:50) [13]
> внимательно прочитать то что я сказал

Прочитал. Понял. Спасибо. :)

Но это ещё не все глюки.
Вот такая функция :
function Test4u(strs: TStrings): TStrings;
begin
Result := TStringList.Create;
Result.BeginUpdate;
try
Result.Add("asdf");
Result.Add("asdf");
Result.Add("asdf");
finally
Result.EndUpdate;
end;
end;

Когда я её вызываю из Unit2, вот таким образом :
ListBox2.Items := Unit2.Test4u(Memo2.Lines);
то всё в пордяке. В листбокс2 вставляется asdf три раза.

А стоит мне её вызвать из Длл таким же образом :
ListBox2.Items := Test4(Memo2.Lines);, как получаю сообщение об ошибке : "Cannot assign a TStringList to TListBoxStrins".
Пытался извратиться :
ListBox2.Items.Text := String(Test4(Memo2.Lines));
В результате в ListBox2 вставляется три непонятных символа.

С чем такое может быть связано ? И как это дело разрешать ?


 
Кен ©   (2003-10-21 05:56) [15]


> Anatoly Podgoretsky © (20.10.03 08:32) [11]

Кстати, скачал на вашем сайте книгу Delphi5vol1.pdf . Книга хорошая, полезная, но почему то когда копирую из неё тексты примеров программ, копируется какая-то абракадабра.
Если это такая странная защита, то зачем она нажуна ? Зачем приводить примеры и недавать их скопировать ?
Если это глюк, то было бы неплохо его исправить.


 
Спрашивающий_   (2003-10-21 06:32) [16]

А стоит мне её вызвать из Длл таким же образом :
ListBox2.Items := Test4(Memo2.Lines);, как получаю сообщение об ошибке : "Cannot assign a TStringList to TListBoxStrins".

А ты внимательно текст читал который идет в приамбуле к модулю
DLL?


 
Кен ©   (2003-10-21 06:55) [17]


> Спрашивающий_ (21.10.03 06:32) [16]
> А ты внимательно текст читал который идет в приамбуле к
> модулю
> DLL?

Читал то может и внимательно, а вот понял в силу своего понимания английского языка.
Хотелось бы точный русский перевод.


 
Спрашивающий_   (2003-10-21 07:26) [18]

Спасибо что хоть справку по Delphi не попросил точно перевести.
Постарайся сам перевсти, не сможешь, будет тебе точный перевод. PS.Я то же в английском не силен, но для этого есть словари.


 
icWasya ©   (2003-10-21 09:27) [19]

примерно так

library Project1;

{ Важное примечание относительно менеджера памяти DLL:
ShareMem должен быть первым Юнитом в секции USES проекта Вашей библиотеки
и в секции USES в проекте Вашего приложения (выберите Project-View Source),
если Ваша DLL экспортирует любые процедуры или функции, которые передают строки как параметры или результаты функций.
Это необходимо для всех строк(и динамических массивов- Wasya), которые передаются к и от вашего DLL - даже те,
которые вложены в рекорды и классы.
ShareMem - интерфейсный юнит к библиотеке BORLNDMM.DLL разделяемого менеджера памяти,
который должен быть установлен в тот же каталог, что и Ваша DLL.
Чтобы избежать использования BORLNDMM.DLL, вместо String используйте параметры PCHAR или ShortString.}

uses
SysUtils,
Classes;

{$R *.RES}

begin
end.


 
Кен ©   (2003-10-22 02:00) [20]


> icWasya © (21.10.03 09:27) [19]
> ShareMem - интерфейсный юнит к библиотеке BORLNDMM.DLL разделяемого
> менеджера памяти,
> который должен быть установлен в тот же каталог, что и Ваша
> DLL.
> Чтобы избежать использования BORLNDMM.DLL, вместо String
> используйте параметры PCHAR или ShortString

Это мне надо, что ? Теперь везде тоскать с собой этот BORLNDMM.DLL ? Нельзяли его как нибудь прикомпилировать к моей dll ?


 
www   (2003-10-22 05:54) [21]

Тебе надо пользоваться PChar, а если хочешь возвратить из DLL строку, то поищи на этом же сайте статью Трепалина Сергея "Профессиональная разработка приложений с помощью Delphi". Так вот там, в одной из глав, найдешь очень полезную статейку, дающую основы для понимания работы с DLL.


 
Anatoly Podgoretsky ©   (2003-10-22 09:22) [22]

Рано и не нужно для скрытия кода делать ДЛЛ, есть простые методы без этого изращения, которое у тебя вряд ли получится.
Изучайте материальную часть.


 
Кен ©   (2003-10-23 01:51) [23]


> Anatoly Podgoretsky © (22.10.03 09:22) [22]
> Рано и не нужно для скрытия кода делать ДЛЛ, есть простые
> методы без этого изращения, которое у тебя вряд ли получится.

У меня уже всё получилось.
Просто заменил TStrings на String везде.
До замены String на PChar ещё не дошёл. Да и просто лень это делать. А файл BORLNDMM.DLL занимает не много.

И всё таки зачем зашифрована книга Delphi5vol1.pdf, что на вашем сайте ? Нельзя ли её как нибудь расшифровать, чтобы примеры оттуда копировать можно было ?


 
Anatoly Podgoretsky ©   (2003-10-23 04:54) [24]

Зашифрована она затем, что бы ты не мог копировать.


 
Кен ©   (2003-10-23 07:41) [25]


> Anatoly Podgoretsky © (23.10.03 04:54) [24]
> Зашифрована она затем, что бы ты не мог копировать.

А вам жалко что-ли ? В книге много примеров, их удобно копировать, вставлять в Дельфи и смотреть как это всё работает.
Разве нет ?
Или вы просто не в силах её расшифровать ?


 
Anatoly Podgoretsky ©   (2003-10-23 09:09) [26]

Мне не жалко, а зачем мне что то расшифровывать, что мне делать больше нечего? Или может быть ты научишься наконец пользоваться Интернетом?


 
Кен ©   (2003-10-24 01:52) [27]


> Anatoly Podgoretsky © (23.10.03 09:09) [26]
> Мне не жалко, а зачем мне что то расшифровывать, что мне
> делать больше нечего? Или может быть ты научишься наконец
> пользоваться Интернетом?

А зачем вы вообще тогда выкладываете на своём сайте книгу ? Вам, что, делать больше нечего ? Чтобы все скачивали и мучались ?

Я скачал с другого сайта туже книгу. И как оказалось, тоже зашифрованную. Если можете расшифровать - то расшифруйте, чтобы люди не мучались. Если это за пределами ваших возможностей, то говорить не о чем.


 
Германн ©   (2003-10-24 03:49) [28]

2 Кен © (24.10.03 01:52) [27]
Т.е. ты настойчиво просишь, чтобы Анатолий на публичном форуме пошел по пути Дмитрия Склярова?
Тогда ответь - сколько тебе предложили за "подначку"?


 
Кен ©   (2003-10-24 07:37) [29]


> Германн © (24.10.03 03:49) [28]
> 2 Кен © (24.10.03 01:52) [27]
> Т.е. ты настойчиво просишь, чтобы Анатолий на публичном
> форуме пошел по пути Дмитрия Склярова?

Я бы сам с удовольствием пошёл этим путём. Пусть обо мне узнает весь мир. Но это не так просто.


 
Anatoly Podgoretsky ©   (2003-10-24 07:53) [30]

Кен © (24.10.03 07:37) [29]
Ты хочешь что бы я расшифровал? Тогда за работу надо заплатить из расчета $100 в час и как ты понимаешь это займет не один час, но может ты другого наймешь более дешевая, раз с Интернетом у тебя так плохо обстоят дела. Но еще дешевле будет сходить на курсы компьютерной грамотности, ну или кого другого попросить, что бы начили пользоваться.



Страницы: 1 вся ветка

Текущий архив: 2003.11.03;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.016 c
14-8615
ZioN
2003-10-14 17:56
2003.11.03
Где найти инфу о создании учебных програм?


1-8483
dolphin1
2003-10-24 01:12
2003.11.03
Process


1-8393
LaidBack
2003-10-21 16:15
2003.11.03
Help: Не вызывается BreakPoint при отладке DLL под XP!


14-8593
Izyum
2003-10-15 13:34
2003.11.03
Как становятся Мастерами?


1-8505
Fredericco
2003-10-23 19:12
2003.11.03
TWriter & TReader в D5 & D6.