Помощь - Поиск - Пользователи - Календарь
Полная версия: Передача параметров в dll
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Делфи
Гость
Доброго времени суток. В функцию из dll пытаюсь впихнуть цикл. Количество итераций определяется переданным из программы целочисленным параметром. Функция dll должна возращать результат типа double. Выглядит все это примерно так:
function MyFunc(Period: Integer): Double; StdCall;
var
Sum: Double;
begin
for i := 1 to Period do
begin
Sum := Sum + GetData;
end;
Result := Sum;
end;
GetData - другая функция, которая подключается к БД и вытаскивает оттуда значение типа doudle. Все вроде работает (подключение к БД из dll и т.д.), но параметр Period передается как-то непонятно. Пример: при задании в основной программе этому параметру цифры 5 в dll он передается как 1244664.

Подскажите, пожалуйста, как можно разобраться с этим глюком
klem4
как ты вызываешь функцию ? Да и вообще привел бы полный код dll.
Гость
Вот код dll. Пока просто тренируюсь, так что ничего выдающегося.

library MyLib;


uses
SysUtils, Classes, ADODB, DB;

var
atTable: TADOTable;
ADOConnect: TADOConnection;
ConnStatus: Boolean;

//Подключение к базе
procedure ConnectDB;
begin
if ConnStatus = False then
begin
ADOConnect := TADOConnection.Create(nil);
ADOConnect.Close;
ADOConnect.ConnectionString :=
'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\PROJECTS\Base\Base.mdb;Persist Security Info=False';
ADOConnect.LoginPrompt := False;
ADOConnect.Open;

atTable := TADOTable.Create(nil);
atTable.Close;
atTable.ConnectionString := ADOConnect.ConnectionString;
atTable.TableName := 'Table1';
atTable.Open;
atTable.Last;

ConnStatus := True;
end;
end;

//Функция вытаскивания значения.
//Каждый раз при обращении подтягивается предыдущая строка (от конца таблицы к началу)
function GetData: Double;
begin
Result := atTable.FieldValues['Field8'];
atTable.Prior;
end;

function MyFunc(Period: Integer): Double; StdCall;
var
Sum: Double;
begin
ConnectDB;
for i := 1 to Period do
begin
Sum := Sum + GetData;
end;
Result := Sum;
end;


exports MyFunc;

{$R *.res}

begin
end.
Обращение к библиотеке происходит по нажатию пункта меню. Результат помещается в метку:
procedure TfrmMain.mmMyFuncClick(Sender: TObject);
var
f: Double;
begin
f := MyFunc(5);
Label1.Caption := FloatToStr(f);
end;
Если в функции библиотеки сделать Result := 5, то все выводится четко. Если же Result := Period, то вместо 5 получается 1244664
Гость
Забыл еще объявление i: Integer в MyFunc
volvo
Как DLL подключается к проекту, и как в программе описана функция MyFunc?
Гость
Делал по книге. После описания главной формы, вставил описание функции из dll:
function MyFunc(Period: Integer): Double;

Потом после implementation
function MovingAverage; external 'Indicators.DLL' name 'MovingAverage';
Гость
Т.е. function MyFunc; external 'MyLib.DLL' name 'MyFunc'; после implementation. Это тренировочная библиотека, а другая будет рабочей, если получится =)
volvo
Сорри, так что ж ты хочешь? Ты ж не указал, что при передаче параметров в функцию используется StdCall, вот и получаешь бред в стеке smile.gif

Опиши функцию вот так:
...
function MyFunc(Period: Integer): Double; StdCall; external 'Project1.dll'; { Перед Implementation }

implementation
...

и все заработает (у меня на тестовом проекте, по крайней мере, отработало).
Гость
Volvo, спасибо огромное. Как все просто-то оказалось =). Жаль, не могу плюсик добавить
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.