Форум: "Начинающим";
Текущий архив: 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