![]() |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
![]() |
Гость |
![]()
Сообщение
#1
|
Гость ![]() |
Доброго времени суток. В функцию из 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 |
![]()
Сообщение
#2
|
![]() Perl. Just code it! ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: ![]() ![]() ![]() |
как ты вызываешь функцию ? Да и вообще привел бы полный код dll.
-------------------- perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
|
Гость |
![]()
Сообщение
#3
|
Гость ![]() |
Вот код 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 |
Гость |
![]()
Сообщение
#4
|
Гость ![]() |
Забыл еще объявление i: Integer в MyFunc
|
volvo |
![]()
Сообщение
#5
|
Гость ![]() |
Как DLL подключается к проекту, и как в программе описана функция MyFunc?
|
Гость |
![]()
Сообщение
#6
|
Гость ![]() |
Делал по книге. После описания главной формы, вставил описание функции из dll:
function MyFunc(Period: Integer): Double; Потом после implementation function MovingAverage; external 'Indicators.DLL' name 'MovingAverage'; |
Гость |
![]()
Сообщение
#7
|
Гость ![]() |
Т.е. function MyFunc; external 'MyLib.DLL' name 'MyFunc'; после implementation. Это тренировочная библиотека, а другая будет рабочей, если получится =)
|
volvo |
![]()
Сообщение
#8
|
Гость ![]() |
Сорри, так что ж ты хочешь? Ты ж не указал, что при передаче параметров в функцию используется StdCall, вот и получаешь бред в стеке
![]() Опиши функцию вот так: ...
function MyFunc(Period: Integer): Double; StdCall; external 'Project1.dll'; { Перед Implementation }
implementation
...
и все заработает (у меня на тестовом проекте, по крайней мере, отработало). Сообщение отредактировано: volvo - 6.07.2008 14:54 |
Гость |
![]()
Сообщение
#9
|
Гость ![]() |
Volvo, спасибо огромное. Как все просто-то оказалось =). Жаль, не могу плюсик добавить
|
![]() ![]() |
![]() |
Текстовая версия | 28.07.2025 18:34 |