Доброго времени суток. В функцию из 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
6.07.2008 16:08
как ты вызываешь функцию ? Да и вообще привел бы полный код dll.
Гость
6.07.2008 17:18
Вот код 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;
//Функция вытаскивания значения. //Каждый раз при обращении подтягивается предыдущая строка (от конца таблицы к началу) 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
Гость
6.07.2008 17:32
Забыл еще объявление i: Integer в MyFunc
volvo
6.07.2008 18:40
Как DLL подключается к проекту, и как в программе описана функция MyFunc?
Гость
6.07.2008 18:44
Делал по книге. После описания главной формы, вставил описание функции из dll: function MyFunc(Period: Integer): Double;
Потом после implementation function MovingAverage; external 'Indicators.DLL' name 'MovingAverage';
Гость
6.07.2008 18:47
Т.е. function MyFunc; external 'MyLib.DLL' name 'MyFunc'; после implementation. Это тренировочная библиотека, а другая будет рабочей, если получится =)
volvo
6.07.2008 18:51
Сорри, так что ж ты хочешь? Ты ж не указал, что при передаче параметров в функцию используется StdCall, вот и получаешь бред в стеке
Опиши функцию вот так:
... function MyFunc(Period: Integer): Double; StdCall; external 'Project1.dll'; { Перед Implementation }
implementation ...
и все заработает (у меня на тестовом проекте, по крайней мере, отработало).
Гость
6.07.2008 19:02
Volvo, спасибо огромное. Как все просто-то оказалось =). Жаль, не могу плюсик добавить
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.