Форум: "Основная";
Текущий архив: 2003.07.24;
Скачать: [xml.tar.bz2];
Внизвызов из DLL Найти похожие ветки
← →
olookin (2003-07-10 16:50) [0]Не могу вызвать процедуру из ДЛЛ
Код вызова:
unit Unit1;
interface
uses ShareMem, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TDoubleArray = array of double;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
procedure SortArray(var ValueArray: TDoubleArray; SortType: integer); external "D:\Program Files\Borland\Delphi5\Projects\EqapMath\EqapMath.dll";
function PosInArray(ValueArray: TDoubleArray; Value: double; GetProximal: boolean): integer; external "D:\Program Files\Borland\Delphi5\Projects\EqapMath\EqapMath.dll";
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var rv: TDoublearray;
i,n: integer;
begin
setlength(rv,11);
randomize;
for i:=0 to 10 do rv[i]:=random(100);
n:=PosInArray(rv,7,true);
end;
end.
Код из библиотеки:
function PosInArray(ValueArray: TDoubleArray; Value: double;
GetProximal: boolean): integer; stdcall;
var i,p: integer;
d: double;
srv: TDoubleArray;
begin
if ValueArray=nil then PosInArray:=0 else
if (Value>=MinValue(ValueArray)) and (Value<=MaxValue(ValueArray)) then begin
if GetProximal=false then for i:=0 to Length(ValueArray)-1 do
if ValueArray[i]=Value then begin p:=i; break; end;
if GetProximal then begin SetLength(srv,Length(ValueArray));
for i:=0 to Length(ValueArray)-1 do srv[i]:=Abs(ValueArray[i]-Value);
ValueInArray(srv,0,Length(srv),"min",p); end; PosInArray:=p; end else
PosInArray:=Length(ValueArray)-1; srv:=nil;
end;
Почему не работает?
← →
Poirot (2003-07-10 16:52) [1]stdcall при вызове поставь
← →
Poirot (2003-07-10 16:53) [2]да и сами объявления в имплементатион убери... это же фактически реализация функции!
← →
panov (2003-07-10 17:08) [3]Что значит - не могу вызвать?
← →
olookin (2003-07-10 17:16) [4]Код
procedure SortArray(var ValueArray: TDoubleArray; SortType: integer); register;
var i,j,n,len: integer;
m: double;
begin
rv:=Copy(ValueArray,0,Length(ValueArray)); n:=0; len:=Length(rv)-1;
for i:=0 to Length(rv)-1 do begin m:=MinValue(rv);
for j:=0 to Length(rv)-1 do if rv[j]=m then begin
case SortType of 1: ValueArray[n]:=rv[j];
2: ValueArray[len-n]:=rv[j]; end;
Inc(n); rv[j]:=MaxValue(rv); break; end; end; rv:=nil;
end;
← →
olookin (2003-07-10 17:17) [5]to Poirot - не понял, откуда убрать?
← →
panov (2003-07-10 17:19) [6]И все же...
← →
Poirot (2003-07-10 17:19) [7]У тебя в интерфейсе... я неуверен что это правильно! stdcall
так надо!!!
implementation
procedure SortArray(var ValueArray: TDoubleArray; SortType: integer); external "D:\Program files\Borland\Delphi5\Projects\EqapMath\EqapMath.dll"; stdcall;
function PosInArray(ValueArray: TDoubleArray; Value: double; GetProximal: boolean): integer; external "D:\Program Files\Borland\Delphi5\Projects\EqapMath\EqapMath.dll"; stdcall;
← →
olookin (2003-07-10 17:26) [8]to Poirot - результат такой же даже когда помещено в implementation
to panov - не могу без ошибки вызвать процедуру из библиотеки...
← →
panov (2003-07-10 17:29) [9]Блин... ну так что же за ошибка и в каком месте происходит?
← →
olookin (2003-07-10 17:31) [10]to panov - сейчас ошибка такая - вызов происходит внешне нормально и делается что надо... А при закрытии программы возникает Invalid pointer operation
← →
Skier (2003-07-10 17:31) [11]>olookin
1) Модуль ShareMem должен быть первым в списке uses
и в host-приложении и в DLL
2) Проверь соглашения о передаче параметров процедуры SortArray
и в host-приложении и в DLL должно быть одно и то же
← →
olookin (2003-07-10 17:37) [12]to Skier - все уже сделал так как ты говоришь - все равно ошибка...
← →
Poirot (2003-07-10 17:43) [13]выводи что получил после едита!
← →
panov (2003-07-10 17:45) [14]PosInArray:=Length(ValueArray)-1; srv:=nil
Почему так?
← →
olookin (2003-07-10 17:51) [15]to panov - обнуляю массив - он же динамический чего ему висеть...
Для всех - проблема уже решена - всем спасибо..
← →
Skier (2003-07-10 17:59) [16]>olookin © (10.07.03 17:51)
> Для всех - проблема уже решена - всем спасибо..
А где был косяк ?
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.07.24;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.009 c