Доброго времени суток. В функцию из 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.
Подскажите, пожалуйста, как можно разобраться с этим глюком
Вот код 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
Т.е. function MyFunc; external 'MyLib.DLL' name 'MyFunc'; после implementation. Это тренировочная библиотека, а другая будет рабочей, если получится =)