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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.12.2011, 10:43   #1
Oliveyra
 
Регистрация: 12.04.2011
Сообщений: 6
Восклицание Delph. Функция из DLL возвращает 0.

Доброго времени суток! Ребята, в курсовике задание: создать ДЛЛ библиотеку и динамически подключить её к программе. Так вот библиотеку создал, подключил статически - все работает, стал переподключать динамически - одна функция возвращает 0 по непонятным мне причинам. Если можно помогите устранить неполадку.

Функция из ДДЛ-ла
Код:
function GetDiag (x:matrix; n: integer):real; stdcall;
   var i,j:integer; s: real;
begin
  s:=0;
  for i:=1 to n do
    for j:=1 to n do begin
    if i=j then
      s:=s+x[i,j];
      end;
  Result:=s;
end;

Процедура заполнения стринггрида:
Код:
procedure Matrica;
var i,j: integer;
begin
  with Form1 do begin
    na:=strtoint(edit1.text);
    StrnGrd1.RowCount:=na;
    StrnGrd1.ColCount:=na;
    for i:=1 to na do
      for j:=1 to na do
        StrnGrd1.Cells[j-1,i-1]:=FloatToStrF(a[i,j],ffFixed,8,3);
  end;
end;
 
procedure TForm1.btn3Click(Sender: TObject);
var i,j: integer;
begin
    randomize;
    for i:=1 to na do
      for j:=1 to na do
        a[i,j]:=sin(random(100))*512;
    Matrica;
 
end;
Процедура денамического подключения:
Код:
procedure TForm1.btn1Click(Sender: TObject);
begin
 {"Чистим" адрес функции от "грязи"}
  @getdiag := nil;
  {Пытаемся загрузить библиотеку}
  LibHandle := LoadLibrary('MYDLL.DLL');
  {Если все OK}
  if LibHandle >= 32 then begin
    {...то пытаемся получить адрес функции в библиотеке}
  @getdiag := GetProcAddress(LibHandle,'getdiag');
    {Если и здесь все OK}
  if @getdiag <> nil then
      {...то вызываем эту функцию и показываем результат}
  s:=GetDiag(a,na);
txt1.Caption:='Відповідь: '+floattostrf(s,fffixed,8,3);
  end;
  {не забываем освободить память и выгрузить DLL}
  FreeLibrary(LibHandle);
end;
Вроди бы все.

Одно примечание:

Вот процедура суммы элементов матрицы:
Код:
procedure TForm1.btn5Click(Sender: TObject);
 var s:real;
begin
   {"Чистим" адрес функции от "грязи"}
  @GetSumm := nil;
  {Пытаемся загрузить библиотеку}
  LibHandle := LoadLibrary('MYDLL.DLL');
  {Если все OK}
  if LibHandle >= 32 then begin
    {...то пытаемся получить адрес функции в библиотеке}
    @GetSumm := GetProcAddress(LibHandle,'GetSumm');
    {Если и здесь все OK}
    if @GetSumm <> nil then
      {...то вызываем эту функцию и показываем результат}
      s:=GetSumm(a,na);
    txt1.Caption:='Відповідь: '+floattostrf(s,fffixed,8,3);
  end;
  {И не забываем освободить память и выгрузить DLL}
  FreeLibrary(LibHandle);end;
Отличается мало чем от сумы главной диагонали, но РАБОТАЕТ!
Oliveyra вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функция не возвращает данные. Abuhamed JavaScript, Ajax 4 26.10.2011 10:33
Функция возвращает массив Рик Общие вопросы Delphi 5 22.03.2011 09:07
Функция Pos возвращает 0 gufon Общие вопросы Delphi 16 14.03.2011 22:10
функция не возвращает результат=( Chica Bond Общие вопросы C/C++ 14 03.12.2010 18:47
Функция не возвращает значения 2.0 Winlook PHP 1 10.05.2010 00:58