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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.10.2009, 18:21   #1
vl1639
 
Регистрация: 16.01.2009
Сообщений: 8
По умолчанию Помогите найти ошибку в простом варианте DLL.

Помогите найти ошибку в простом варианте DLL. Для уверенности я проверяю совместную работу сначала как основную программу и функцию в одном файле
Код:
program test1;
{$APPTYPE CONSOLE}
uses
  SysUtils;
Type
 pdouble = ^double;
Var 
 ChangeMass :array [1..10] of double;

Function GetSimpleChange( nn :integer; a,b :double ):Pchar; stdcall;
Var
 pdou : pdouble;
 pcha : pChar;
 ii :integer;
begin
  if nn=1 then for ii:=1 to 10 do ChangeMass[ii] := 10*ii + a ;
  if nn>1 then for ii:=1 to 10 do ChangeMass[ii] := 10*ii + b;
  pdou := @ChangeMass[1];
  pcha := pChar(pdou);
  Result := pcha;
end;

var
 ff :textfile;
 pch :pChar;
 buff :array [1..10] of double;
 ii, num :integer;
begin
  { TODO -oUser -cConsole Main : Insert code here }
 AssignFile(ff,'vih.tab'); ReWrite(ff);
 for num:=1 to 2 do begin
           pch := GetSimpleChange(num, 1.0, 5.0);
           move(pch^,buff,sizeof(double)*10);
           for ii:=1 to 5 do Write(ff,buff[ii]:10:2);  Writeln(ff);
  end;
  CloseFile(ff);
end.

Здесь все нормально и печатается, как ожидалось
11.00 21.00 31.00 41.00 51.00
15.00 25.00 35.00 45.00 55.00

Теперь разбиваю задачу на основную прогу и DLL
==Текст DLL
Код:
library mydll;
uses
  SysUtils, Classes;
{$R *.res}
Type
 pdouble = ^double;
Var
 ChangeMass :array [1..10] of double;

Function GetSimpleChange( nn :integer; a,b :double ):Pchar; stdcall;
Var
 pdou : pdouble;
 pcha : pChar;
 ii :integer;
begin
  if nn=1 then for ii:=1 to 10 do ChangeMass[ii] := 10*ii + a ;
  if nn>1 then for ii:=1 to 10 do ChangeMass[ii] := 10*ii + b;
  pdou := @ChangeMass[1];
  pcha := pChar(pdou);
  Result := pcha;
end;

exports GetSimpleChange;
begin
end.

==Текст вызывающей программы
Код:
program test1;
{$APPTYPE CONSOLE}
uses
  Windows, Dialogs, SysUtils;
var
  GetSimpleChange:function( nn :integer; a,b :double ):PChar;
  LibHandle :THandle;

var
 ff :textfile;
 pch :pChar;
 buff :array [1..10] of double;
 ii, num :integer;
begin
  { TODO -oUser -cConsole Main : Insert code here }
 for ii:=1 to 10 do buff[ii] :=0.0;
 AssignFile(ff,'vih.tab'); ReWrite(ff);

 @GetSimpleChange := nil;
 LibHandle := LoadLibrary('mydll.dll');
  if ( LibHandle < 32 ) then ShowMessage('Error Load DLL')
  else  begin
   @GetSimpleChange := GetProcAddress(LibHandle,'GetSimpleChange');
   if @GetSimpleChange <> nil then
     begin
       for num:=1 to 2 do begin
           pch := GetSimpleChange(num, 1.0, 5.0);
           move(pch^,buff,sizeof(double)*10);
           for ii:=1 to 5 do Write(ff,buff[ii]:10:2);  Writeln(ff);
       end;
     end;
  end;

  FreeLibrary(LibHandle);
  CloseFile(ff);
end.

Использую загрузку по образцу из Инета, а все остальное как в верхнем примере, а в результате
0.00 0.00 0.00 0.00 0.00
0.00 0.00 0.00 0.00 0.00
Что-то я делаю не так - подскажите!!!
vl1639 вне форума Ответить с цитированием
Старый 24.10.2009, 18:20   #2
vl1639
 
Регистрация: 16.01.2009
Сообщений: 8
По умолчанию

Мне подсказали и теперь вижу - не указана конвенция в вызывающей функции. Вопрос закрыт.
vl1639 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
помогите найти ошибку deadh5n1 Помощь студентам 1 13.03.2009 20:56
Помогите найти ошибку Manchester Помощь студентам 3 09.02.2009 22:26
Помогите найти ошибку KnDmPetr Паскаль, Turbo Pascal, PascalABC.NET 1 11.04.2008 15:48