Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.12.01;
Скачать: [xml.tar.bz2];

Вниз

Как создать 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.002 c
15-1371109866
картман
2013-06-13 11:51
2013.12.01
адвокаты, нотариусы и подобные


15-1370939812
брат Птибурдукова
2013-06-11 12:36
2013.12.01
Подскажите инструмент


4-1238947064
MultIfleX
2009-04-05 19:57
2013.12.01
Имена сеанса и клиента текущщей сессии пользователя


15-1370938997
[ВладОшин]
2013-06-11 12:23
2013.12.01
Переписать расчеты с клиента на сервер


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский