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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.04.2011, 23:38   #1
Crabobass
Пользователь
 
Регистрация: 06.03.2011
Сообщений: 23
По умолчанию Проблема с DLL

Вечер добрый, хотя кому как...Есть детская задачка которую нужно реализовать с помощью Dll. Но возникает ошибка. Помогите определить почемую
код Dll
Код:
library MyDll;

{ 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 Mas(n:integer):String; stdcall;
var
  a:array of Integer;
  i,sum:Integer;
  r:real;
  s:String;
begin
  sum:=0;
  SetLength(a,n);
  For i:=0 to n do
  begin
  Randomize;
  a[i]:=Random(25);
  sum:=sum+a[i];
  end;
  r:=sum/n;
  S:=('Ñðåäíåå àðèôìåòè÷åñêîå = '+FloatToStr(r));
  Result:=S;
end;
  exports Mas;
begin
end.
код Приложения
Код:
unit FII1;

interface

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

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    btn1: TButton;
    btn2: TButton;
    Edit2: TEdit;
    procedure btn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 function Mas (n:integer):string;stdcall;
var
  Form1: TForm1;

implementation

{$R *.dfm}
function Mas; external 'MyDll.DLL' name 'Mas';
procedure TForm1.btn1Click(Sender: TObject);
var
  N:Integer;
begin
  N:=StrToInt(Edit2.text);
  Edit1.text:=Mas(n);
 end;

end.
Т.к. использую строки кинул в каталог BORLNDMM.DLL и в uses прописал ShareMem. Такие дела. Подскажите что не так делаю.
Crabobass вне форума Ответить с цитированием
Старый 21.04.2011, 23:55   #2
eduard93
Форумчанин
 
Регистрация: 06.12.2010
Сообщений: 300
По умолчанию

Откройте Project -> View source, и пропишите ShareMem там самым первым.
Второй вариант заменить string на Widestring. Тогда от ShareMem можно вообще отказатся.
eduard93 вне форума Ответить с цитированием
Старый 22.04.2011, 00:03   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Не исаользуйте string в dll'ках. Используйте PChar
Человек_Борща вне форума Ответить с цитированием
Старый 22.04.2011, 00:06   #4
Crabobass
Пользователь
 
Регистрация: 06.03.2011
Сообщений: 23
По умолчанию

Так и сделал. Просто что то на этот раз вообще ничего не понял. Сначала ругался и говорил Invalid Pointer Operation Потом начал выдавать другую ошибку...Короче если у кого нибудь возникнут проблемы с dll, читайте этого гражданина - http://www.gunsmoker.ru/2009/01/blog-post.html. Спасибо ребят.
Crabobass вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема dll EXMP Софт 0 18.08.2010 09:30
Dll - проблема nXs Общие вопросы Delphi 2 16.07.2010 14:53
Проблема с DLL _-Re@l-_ Паскаль, Turbo Pascal, PascalABC.NET 3 09.06.2010 14:28
Проблема с DLL. profi Помощь студентам 5 06.01.2009 23:48
Проблема с dll( DM_bite Помощь студентам 10 31.07.2008 16:05