Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.12.01;
Скачать: CL | DM;

Вниз

Как создать dll c вложенными функциями?   Найти похожие ветки 

 
kelpie1988 ©   (2013-02-19 13:20) [0]

Здравствуйте!
Подскажите пожалуйста как в Delphi dll создавать процедуры или функции, в которых вызываются другие более простые функции?
Например: В функции MyFunc вызывается функция MyF? Если скомпилировать код помещенный ниже, то появляется ошибка: Exports allowed only in a global scope.

library TestDelphiLib;

uses
SysUtils,
Classes;
function MyF(num_1,num_2: Integer): Real;
type
tMyIntArray = array [0 .. 9] of integer;

Function MyFunc(var TestArray1: tMyIntArray; var TestArray2: tMyIntArray):Real; stdcall;export;
var
num1, num2, i : Integer;
begin

num1 :=0; num2 :=0;
for i:=0 to 9 do
begin
num1 := TestArray1[i] + num1;
num2 := TestArray2[i]+ num2;
end;
Result := MyF(num1,num2);

end;

exports
MyFunc;

function MyF(num_1,num_2: Integer): Real;
begin
Result := num_1 + num_2;
end;

begin
end.

Очень нужно!


 
Ega23 ©   (2013-02-19 13:29) [1]


// JCL_DEBUG_EXPERT_GENERATEJDBG OFF
// JCL_DEBUG_EXPERT_INSERTJDBG OFF
// JCL_DEBUG_EXPERT_DELETEMAPFILE OFF
library xxx;

{$R "substcodes.res" "substcodes.rc"}

uses
 Windows,
 SysUtils,
 Classes,
 xxx.DLL.Core in "xxx.DLL.Core.pas",
  ....
 xxx.Substcodes in "xxx.Substcodes.pas";

{$R *.res}
{$R "dlg.res" "dlg.rc"}

function DLLGetXMLHandle(Info: PxxxXMLInfo): TxxxResult; stdcall;
begin
 Result := TxxxDLLCore.GetXMLHandle(Info);
end;

//*****************************************************************************

function DLLGetXML(xxxHandle: TxxxHandle; Buffer: Pointer): TxxxResult; stdcall;
begin
 Result := TxxxDLLCore.GetXML(xxxHandle, Buffer);
end;

//*****************************************************************************

function DLLReleaseXMLHandle(xxxHandle: TxxxHandle): TxxxResult; stdcall;
begin
 Result := TxxxDLLCore.ReleaseXMLHandle(xxxHandle);
end;

//*****************************************************************************

procedure DLLEntryPoint(dwReason: DWORD);
begin
 case dwReason of
   DLL_PROCESS_ATTACH: TxxxDLLCore.InitCore;
   DLL_PROCESS_DETACH: TxxxDLLCore.ReleaseCore;
 end;
end;

//*****************************************************************************

exports
 DLLGetXMLHandle,
 DLLGetXML,
 DLLReleaseXMLHandle;

begin
 DLLProc := @DLLEntryPoint;
 DLLEntryPoint(DLL_PROCESS_ATTACH);
end.


 
Ega23 ©   (2013-02-19 13:34) [2]

unit xxx.DLL.Core;

interface

uses
 Windows,
 SysUtils,
 Classes,
 Generics.Collections,
 xxx.Loader,
 xxx.SDK,
 xxx.ConvertInfo,
 xxx.Preprocessor,
 xxx.Converter;

type

 TxxxDLLCore = class
 private
   class procedure Lock;
   class procedure Unlock;

 public
   class function GetXMLHandle(Info: PxxxXMLInfo): TxxxResult;
   class function GetXML(xxxHandle: TxxxHandle; Buffer: Pointer): TxxxResult;
   class function ReleaseXMLHandle(xxxHandle: TxxxHandle): TxxxResult;

   class procedure InitCore;
   class procedure ReleaseCore;
 end;

implementation

var
 RTL: TRTLCriticalSection;
 xxxHandleList: TObjectList<TMemoryStream>;

//*****************************************************************************

{ TxxxDLLCore }

//*****************************************************************************

class function TxxxDLLCore.GetXML(xxxHandle: TxxxHandle;
 Buffer: Pointer): TxxxResult;
var
 index, sz: Integer;
begin
 Lock;
 try
   index := xxxHandleList.IndexOf(TMemoryStream(xxxHandle));
   if index = -1 then
     Exit(crHandleNotFound);

   sz := xxxHandleList[index].Size;

   if IsBadWritePtr(Buffer, sz) then
     Exit(crNonWritablePtr);

   Move(xxxHandleList[index].Memory^, Buffer^, sz);
   Result := crOK;

 finally
   Unlock;
 end;
end;

//*****************************************************************************

class function TxxxDLLCore.GetXMLHandle(Info: PxxxXMLInfo): TxxxResult;
var
 convertInfo: TxxxConvertInfo;
 ms: TMemoryStream;
begin
 Lock;
 try
   convertInfo := TxxxConvertInfo.Create(Info);
   try

     Result := TxxxLoader.Load(convertInfo);
     if Result <> crOK then
       Exit;

     Result := TxxxPreprocessor.Preprocess(convertInfo);
     if Result <> crOK then
       Exit;

     Result := TxxxConverter.Convert(convertInfo, ms);
     if Result <> crOK then
       Exit;

     xxxHandleList.Add(ms);
     Info^.DataHandle := Integer(ms);
     Info^.DataSize := ms.Size;

   finally
     convertInfo.Free;
   end;
 finally
   Unlock;
 end;
end;

//*****************************************************************************

class procedure TxxxDLLCore.InitCore;
begin
 InitializeCriticalSection(RTL);
 xxxHandleList := TObjectList<TMemoryStream>.Create;
//  DisableThreadLibraryCalls(hInstance);
end;

//*****************************************************************************

class procedure TxxxDLLCore.Lock;
begin
 EnterCriticalSection(RTL);
end;

//*****************************************************************************

class procedure TxxxDLLCore.ReleaseCore;
begin
 xxxHandleList.Free;
 DeleteCriticalSection(RTL);
end;

//*****************************************************************************

class function TxxxDLLCore.ReleaseXMLHandle(
 xxxHandle: TARPSHandle): TxxxResult;
begin
 Lock;
 try
   xxxHandleList.Remove(TMemoryStream(xxxHandle));
   Result := crOK;
 finally
   Unlock;
 end;
end;

//*****************************************************************************

class procedure TxxxDLLCore.Unlock;
begin
 LeaveCriticalSection(RTL);
end;

//*****************************************************************************

end.


 
RWolf ©   (2013-02-19 14:01) [3]

Экспортируемые функции ничем не отличаются от других функций, кроме соглашения вызова.
Директива export не нужна.


 
icWasya ©   (2013-02-19 15:41) [4]

правильное начало TestDelphiLib.dpr
library TestDelphiLib;

uses
 SysUtils,
 Classes;
 function MyF(num_1,num_2: Integer): Real;forward;//<<<===---

и далее по тексту.

А иначе получалось, что весь остальной код модуля - это тело функции MyF, и MyFunc - вложенная функция; тогда её нельзя экспортировать, о чём компилятор и говорит.



Страницы: 1 вся ветка

Текущий архив: 2013.12.01;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.006 c
15-1370889423
TUser
2013-06-10 22:37
2013.12.01
Поехали!


15-1370338471
Els
2013-06-04 13:34
2013.12.01
Какой лучше антивирус выбрать


2-1361265627
kelpie1988
2013-02-19 13:20
2013.12.01
Как создать dll c вложенными функциями?


1-1319355370
Человек
2011-10-23 11:36
2013.12.01
Подавление всех Exception кроме определенного


2-1361347270
O'ShinW
2013-02-20 12:01
2013.12.01
Один и тот же поток в одну и туже крит.секцию