Форум: "Основная";
Текущий архив: 2003.11.03;
Скачать: [xml.tar.bz2];
ВнизКак проще всего преобразовать 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;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.009 c