IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> Передача параметров в dll
сообщение
Сообщение #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.

Подскажите, пожалуйста, как можно разобраться с этим глюком
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 8)
сообщение
Сообщение #2


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


как ты вызываешь функцию ? Да и вообще привел бы полный код dll.


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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. Это тренировочная библиотека, а другая будет рабочей, если получится =)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






Сорри, так что ж ты хочешь? Ты ж не указал, что при передаче параметров в функцию используется StdCall, вот и получаешь бред в стеке smile.gif

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

implementation
...

и все заработает (у меня на тестовом проекте, по крайней мере, отработало).

Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






Volvo, спасибо огромное. Как все просто-то оказалось =). Жаль, не могу плюсик добавить
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 19.04.2024 21:51
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name