1 / 1 / 0
Регистрация: 07.05.2011
Сообщений: 15
1

Сделать программу через Dll

07.05.2011, 12:34. Показов 2236. Ответов 2

Удалить часть символьной строки, заключенные в скобки (вместе со скобками).
Подскажите пожалуйста, что я делаю не правильно.
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
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
  SysUtils,
  Classes;
 
{$R *.res}
function MyString(s:widestring):integer;stdcall;
var q,l,i:integer;
 begin
     q:=0;
For i:=1 to Length(s) do
      If s[i]='(' then
        Begin
            For l:=i to Length(s) do
              If s[l]=')' then Inc(q) else
                Begin
                  Delete(s,i,q+1);
                   Result:=q;
                end;
                end;
                end;
exports MyString name 'MyStr';
begin
end.
сама 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
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
function stringfromdll(s:widestring):integer;stdcall;external 'project1.dll' name 'MyStr';
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
 
begin
 
Edit2.Text:=IntToStr(StringFromdll(Edit1.Text));
end;
 
end.
Button
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.05.2011, 12:34
Ответы с готовыми решениями:

Пытаюсь сделать динамическую загрузку dll. Dll-библиотека не подает признаков жизни
Здравствуйте. У меня такое дело, я пытаюсь создать в своей программе динамическую загрузку...

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

DLL, Сделать программу независимой от компонентов или программ Windows
Всем привет, возможно тема покажется заезженной но все же. Пишу тестирующее приложение на C#...

Как подключить dll (SmartCOM3.dll) к php через расширение php_com_dotnet?
Доброе время суток. Передо мной встала задача через php подцепить SmartCOM3.dll. В мануале...

2
13084 / 5869 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
07.05.2011, 20:15 2
Когда создаётся проект DLL через мастер DLL, в самое начало модуля не зря помещается этот текст:
{ 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. }
Начинается текст с фразы: "Important note" - "важное замечание". Смысл текста сводится к следующему. Вызывающая программа и код DLL имеют отдельные менеджеры памяти. И если между основным и вызывающим кодом происходит передача данных, принадлежащих динамическим типам - длинные строки (String, WideString), динамические массивы, варианты - в этом случае работа с памятью будет нарушена. Что, наиболее вероятно, приведёт к порче данных и краху программы. Чтобы этого избежать можно пойти двумя путями:

1. В раздел Uses всех модулей проекта DLL и проекта вызывающей программы включить имя модуля ShareMem. Причём, этот модуль надо добавить самым первым в список Uses. Это касается также основного модуля программы - т. е. файла *.DPR. Благодаря такому добавлению вызывающий код и код DLL будут использовать один общий менеджер памяти. Это устранит проблемы в управлении памятью.
Менеджер памяти, определённый в модуле ShareMem пользуется набором функций из библиотеки BORLNDMM.DLL. Поэтому в дистрибутив программы следует добавить эту DLL - т. е. BORLNDMM.DLL.
Минус этого подхода в том, что во-первых требуется позаботиться о размещении файла BORLNDMM.DLL в дистрибутиве программы, во-вторых - менеджер памяти из модуля ShareMem может уступать по параметрам оптимизации обыкновенному менеджеру памяти Delphi.

2. Либо, можно не добавлять модуль ShareMem в проект вызывающей программы и проект DLL, но в этом случае отказаться от обмена данными, которые динамических типов. - Например, вместо типа String и WideString использовать типы: PChar и PWideChar. Также, данные типа String можно заменить на ShortString (это строки длина которых не может быть больше 255 символов).

3. Не применять ShareMem, и не отказываться от обмена динамическими данными. Но при этом в проекте DLL надо самостоятельно определить (объявить и реализовать) функции выделения, освобождения и перераспределения памяти. Тогда в основной программе во всех случаях обмена данными с кодом DLL выделять, освобождать и перераспределять память под эти данные только через вызовы соответствующих функций DLL.
Таким образом можно избежать пересечения полномочий двух менеджеров памяти.
---
Наиболее простой путь, в техническом плане - это первый. Не забывая его недостатки по оптимизации и по обязанности переносить вместе с программой файл BORLNDMM.DLL.
---
Решение задачи будет выглядеть так: (с применением модуля ShareMem)
1. Вызывающий код (клиент):
1.1. Главный модуль (модуль проекта):
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
program Project1;
 
uses
  ShareMem,
  Forms,
  Unit1 in 'Unit1.pas' {Form1};
 
{$R *.res}
 
begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
1.2. Модуль Unit1:
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
unit Unit1;
 
interface
 
uses
  ShareMem,
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Memo2: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
//Удаляет из строки все подстроки, начинающиеся со знака '('
//и заканчивающиеся знаком ')'.
function ProcStr(const aStr : String) : String; stdcall;
  external 'Project1.dll' name 'ProcStr';
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo2.Text := ProcStr(Memo1.Text);
end;
 
end.
2. Вызываемый код (сервер, 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
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
  ShareMem,
  SysUtils,
  Classes;
 
{$R *.res}
 
//Удаляет из строки все подстроки, начинающиеся со знака '('
//и заканчивающиеся знаком ')'.
function ProcStr(const aStr : String) : String; stdcall;
var
  i, P1, Len : Integer;
begin
  Result := aStr;
  Len := Length(Result);
  P1 := 0;
  for i := Len downto 1 do begin
    if Result[i] = ')' then
      P1 := i
    else if (Result[i] = '(') and (P1 > 0) then begin
      Delete(Result, i, P1 - i + 1);
      P1 := 0;
    end;
  end;
end;
 
exports ProcStr name 'ProcStr';
 
begin
end.
Пояснение по алгоритму:
Delphi
1
2
3
4
5
6
7
8
  for i := Len downto 1 do begin
    if Result[i] = ')' then
      P1 := i
    else if (Result[i] = '(') and (P1 > 0) then begin
      Delete(Result, i, P1 - i + 1);
      P1 := 0;
    end;
  end;
По мере удаления из строки подстрок вида: '(...)' длина строки меняется, поэтому, перебор символов строки ведётся от конца - к началу. Это позволяет в теле цикла не предусматривать дополнительных действий по учёту длины строки.
---
Ещё одно замечание. В цикле вида for i := a to b do выражения а и b вычисляются только перед первой итерацией. В дальнейшем они не пересчитываются.
Вложения
Тип файла: rar WorkWithDll.rar (246.3 Кб, 40 просмотров)
1
1 / 1 / 0
Регистрация: 07.05.2011
Сообщений: 15
07.05.2011, 21:31  [ТС] 3
Спасибо)Все понятно осталось тока проверить.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.05.2011, 21:31
Помогаю со студенческими работами здесь

Сделать программу через делегат
Надо сделать эту программу через Делегат, что-то не получается, помогите using System; using...

Как сделать программу через объекты?
#include <stdio.h> #include <conio.h> #include <math.h> void main() { float...

Сделать программу на 50 строк через Switch
Сделать программу на 50 строк через Switch

Bass.dll, bass_fx.dll - как сделать, чтобы менялась только высота звука без скорости?
Как сделать, чтобы при изменении частоты потока скорость оставалась той же, то есть, чтобы менялась...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru