Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-8486
aimsyslv
2003-10-22 20:16
2003.11.03
Консольное приложение


1-8362
Master
2003-10-23 04:53
2003.11.03
Как определить букву СD-ROMa? GetDriveType?


14-8609
Skyle
2003-10-14 15:26
2003.11.03
Возник спор о правомерности продаж ПО


1-8379
Lena19
2003-10-22 23:14
2003.11.03
где взять модуль SusUtils


14-8628
Igor_thief
2003-10-14 13:25
2003.11.03
Интерфейсы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский