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

> ВНИМАНИЕ!

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

> Передача параметров в dll
Гость
сообщение 5.07.2008 22:30
Сообщение #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)
klem4
сообщение 6.07.2008 12:08
Сообщение #2


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

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

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


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


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


Гость






Забыл еще объявление i: Integer в MyFunc
 К началу страницы 
+ Ответить 
volvo
сообщение 6.07.2008 14:40
Сообщение #5


Гость






Как DLL подключается к проекту, и как в программе описана функция MyFunc?
 К началу страницы 
+ Ответить 
Гость
сообщение 6.07.2008 14:44
Сообщение #6


Гость






Делал по книге. После описания главной формы, вставил описание функции из dll:
function MyFunc(Period: Integer): Double;

Потом после implementation
function MovingAverage; external 'Indicators.DLL' name 'MovingAverage';
 К началу страницы 
+ Ответить 
Гость
сообщение 6.07.2008 14:47
Сообщение #7


Гость






Т.е. function MyFunc; external 'MyLib.DLL' name 'MyFunc'; после implementation. Это тренировочная библиотека, а другая будет рабочей, если получится =)
 К началу страницы 
+ Ответить 
volvo
сообщение 6.07.2008 14:51
Сообщение #8


Гость






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

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

implementation
...

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

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


Гость






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

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

 

- Текстовая версия 28.07.2025 18:34
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"