Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Странность с вызовом функции из DLL


Страницы:   1 2

Углук ©   (2007-03-05 13:47:00) 

Здравствуйте!
У меня возникла следующая ситуация:
Есть проект, который вызывает функции DLL.

В функции EntryPoint, привязал к  DLL_PROCESS_DETACH одну функцию.
При отладке полоска трассировки  заглядывает внутрь на begin, а затем прыгает в другую функцию! Чушь какая-то, что там происходит, может кто-то сталкивался? Прилагаю код DLL:

Примечание:
Внутри эта DLL,в свою очередь вызывает еще одну DLL.

procedure RunL; stdcall;
var i: byte;
  bVoltage, bSubIndex: BYTE;

   w:word;
begin
AssignFile(f,'dll_log.txt');
Rewrite(f);
InitHAL();
writeln(f,' '+DateTimeToStr(Now));
ActualChannels:=0;
for i:= 0 to 5 do begin
  GetID(i,@bVoltage,@bSubIndex);
//GetID вызов функции еще одной DLL (трассируется нормально)

if bVoltage>0 then
begin
 Inc(ActualChannels,1);
 writeln(f,' Active '+ IntToStr(i) + 'Channel' );
end;
end;

end;

procedure CloseS; stdcall;
begin
writeln(f,DateTimeToStr(Now));
CloseFile(f);
CloseHAL();
end;

procedure EntryProc(dwReason: DWORD);
begin
case dwReason of
  DLL_PROCESS_DETACH: CloseS;
end;
end;

exports   CountVoltage;
exports   RecountADCVoltage;
exports   CountCurrent;
exports   StaticChange;
exports   RecountCurrent;
exports   Runl;
exports   CloseS;

Из процедуры CloseS "заскакивает" в RunL


Углук   (2007-03-05 14:38:00) [1]

Ура! заработало! Регистрочувствительность !Спасибо всем - век не забуду


Сергей М.   (2007-03-05 14:32:00) [2]


> Углук ©   (05.03.07 14:30) [26]



> Не работает нормально отладка


Работает. Причем нормально.


Сергей М.   (2007-03-05 14:31:00) [3]


> Углук


Имена экспортируемых процедур/ф-ций регистрочувствительны !

Run l<> Run L


Углук   (2007-03-05 14:30:00) [4]

Не работает нормально отладка (даже в хост-приложении) и не просходит запись в файл dll_log(Хотя бы это).


Leonid Troyanovsky   (2007-03-05 14:29:00) [5]


> Углук ©   (05.03.07 14:26) [22]

> RunL1:= GetProcAddress(Hinstance1, 'RunL');


Runl.

Принято анализировать GetLastError.

--
Regards, LVT.


Сергей М.   (2007-03-05 14:27:00) [6]

И что "не работает" ?


Сергей М.   (2007-03-05 14:26:00) [7]

А где код хост-проекта ?


Углук   (2007-03-05 14:26:00) [8]

Вот хост-приложение:

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, unit2;

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

 type
  TRunL= procedure; stdcall;

var
 RunL1: TRunL;
b:LongBool;
 Form1: TForm1;
 Hinstance1:DWORD;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
Hinstance1:=LoadLibrary('Project2.dll');
try
RunL1:= GetProcAddress(Hinstance1, 'RunL');
RunL1;
finally
b:=FreeLibrary(Hinstance1);
end;

end;

end.


Углук   (2007-03-05 14:24:00) [9]

Хорошо.
Вот Dll:

library Project2;

uses  SysUtils,Windows,
 Classes,Math,EnergyInterface;
const
      MAX_CHANNELS=6;
      MAX_VOLTAGE:array [0..5] of Extended =     (15.01,15.07,19.98,20.01,29.92,30.005);
      MAX_ADC_VOLTAGE:array [0..5] of Extended = (15.34721,15.34155,20.37806,20.34280,30.56164,30.54950);
      MAX_CURRENT:array [0..5] of Extended =     (3.6,3.6,3.6,3.6,3.6,3.6);
      MAX_ADC_CURRENT:array [0..5] of Extended=  (4.95462,4.99168,4.9958,5.01672,4.893405,4.98753);
      CURRENT_MODIFIER: array [0..5] of Extended=(-0.018,-0.016,-0.02,-0.018,-0.018,-0.018 );
      VOLTAGE_MIN_STEP:array [0..5] of Extended= (0.00023,0.00023,0.0003,0.0003,0.00045,0.00045);
      CURRENT_MIN_STEP:Extended=0.00244;
      NBV=16;
      NBI=12;
      NBV_ADC=12;
      TWO_RAISED_BY_NBV_ADC=4095;
      TWO_RAISED_BY_NBI:DWORD =4095;
      SAMPLES_PER_PERIOD =32;
      TAU_DAC:Extended=66*10e-6;
      TAU_DEL: Extended= 23/4*10e6;
      TAU:Extended=2*10e-4;  //Ïåðèîä èçìåíåíèÿ
{$R *.res}

var f:textfile;
ActualChannels:byte;

function RecountCurrent(Current:Word; Channel:byte):Extended; stdcall;
var t:DWORD;
    g:DWORD;
    s:extended;
begin
 result:=((Current*MAX_ADC_CURRENT[Channel])/(IntPower(2,NBI)-1))-CURRENT_MODIFIER[Channel];
end;

function RecountADCVoltage(Voltage:Word;Channel:byte):Extended; stdcall;
begin
 result:=(Voltage*MAX_ADC_VOLTAGE[Channel])/(IntPower(2,NBV_ADC)-1);
end;

function CountVoltage(V:Extended; Channel:byte):Word; stdcall
begin
if V>MAX_VOLTAGE[Channel] then V:=MAX_VOLTAGE[Channel];
result:=Word(Trunc((V/MAX_VOLTAGE[Channel])*(IntPower(2,NBV)-1)));
end;

procedure StaticChange(Channel: byte; var NewValue:Extended); stdcall;
var value : word;
begin
 if NewValue>MAX_VOLTAGE[Channel] then NewValue:=MAX_VOLTAGE[Channel];
 Enable(0);
 value:=CountVoltage(Round(newValue),Channel);
writeln(f,'Óñòàíàâëèâà 29;òñÿ íàïðÿæåíèå â êàíàëå '+IntToStr(Channel)+' = ' + IntToStr(value));
 setVoltage(Channel,value);

end;

function CountCurrent(V:Extended; Channel:byte):Word;
begin
 if V>MAX_CURRENT[Channel] then V:=MAX_CURRENT[Channel];
 result:=Word(Trunc((V/MAX_CURRENT[Channel])*(IntPower(2,NBI)-1)));
end;

function GetStaticVoltage(Channel:byte):Extended; stdcall;
var wVolt,wNil,wEr:WORD;
bVolt, bNil, bEr:byte;
begin
GetOutState(Channel,@wVolt,@wNil,@bEr);
writeln(f,'Íàïðÿæåíèå â êàíàëå '+IntToStr(Channel)+' = ' + IntToStr(wVolt));
result:=RecountADCVoltage(wVolt,Channel) ;
end;

function GetStaticCurrent(Channel:byte):Extended; stdcall;
var wCurr,wNil,wEr:WORD;
bEr:byte;
begin
GetOutState(Channel,@wNil,@wCurr,@bEr);
writeln(f,'Òîê â êàíàëå '+IntToStr(Channel)+' = ' + IntToStr(wCurr));
result:=RecountCurrent(wCurr,Channel) ;
end;

procedure EnableAll; stdcall;
var i:byte;
begin
for i:= 0 to ActualChannels-1 do Enable(i);
end;

procedure DisableAll; stdcall;
var i:byte;
begin
for i:= 0 to ActualChannels-1 do Disable(i);
end;

procedure RunL; stdcall;
var i: byte;
  bVoltage, bSubIndex: BYTE;

   w:word;
begin
AssignFile(f,'dll_log.txt');
Rewrite(f);
InitHAL();
writeln(f,'Ñòàðò '+DateTimeToStr(Now));
//TestChannels;
ActualChannels:=0;
for i:= 0 to 5 do begin
GetID(i,@bVoltage,@bSubIndex);
if bVoltage>0 then
begin
 Inc(ActualChannels,1);
 writeln(f,' Êàíàë '+ IntToStr(i) + ' â íàëè÷èè' );
end;
end;

end;

procedure CloseS;
begin
writeln(f,'Çàâåðøåíèå ðàáîòû '+DateTimeToStr(Now));
CloseFile(f);
CloseHAL();
end;

exports   CountVoltage;
exports   RecountADCVoltage;
exports   CountCurrent;
exports   StaticChange;
exports   RecountCurrent;
exports   Runl;
exports   CloseS;

begin
end.


Сергей М.   (2007-03-05 14:22:00) [10]

Приводи веськод


Углук   (2007-03-05 14:19:00) [11]

Спасибо. Но все равно не работает:)


Сергей М.   (2007-03-05 14:10:00) [12]

Hinstance1:=LoadLibrary('Project2.dll');
Win32Check(Hinstance1 <> 0);
try
RunL := GetProcAddr(Hinstance1, 'RunL');
Win32Check(Assigned(RunL));
RunL; //собственно вызов
finally
FreeLibrary(Hinstance1);
end;


Сергей М.   (2007-03-05 14:08:00) [13]

type
 TRunL: procedure; stdcall;

var
  RunL: TRunL;

..

Hinstance1:=LoadLibrary('Project2.dll');
Win32Check(Hinstance1 <> 0);
try
 RunL := GetProcAddr(Hinstance1, 'RunL');
finally
 FreeLibrary(Hinstance1);
end;


Сергей М.   (2007-03-05 14:04:00) [14]

И где соответствие соглашений о вызовах ?


Углук   (2007-03-05 14:04:00) [15]


> procedure КакаяТоТамПроцедура; external 'Project2.dll';

А как еще можно сделать, подскажите, пожалуйста


Сергей М.   (2007-03-05 14:03:00) [16]

Тогда зачем

procedure КакаяТоТамПроцедура; external 'Project2.dll';

??


Углук   (2007-03-05 14:02:00) [17]

Динамически


Сергей М.   (2007-03-05 14:02:00) [18]


> А где  ему быть?
>


А кактебе нужно грузить библ-ку - динамически или статически ?


Углук   (2007-03-05 14:01:00) [19]

чего-то я не выкупаю...
> Где в проекте хост-приложения декларация идентификатора
> RunL ?


А где  ему быть?


Сергей М.   (2007-03-05 14:00:00) [20]


> Углук ©   (05.03.07 13:58) [7]
>
> Декларация прописана в pas файле


Ну и какого ж ты грузишь библ-ку дважды?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо