DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: g929959149
今日帖子: 27
在线用户: 11
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 emailx45 (emailx45) ▲▲▲▲△ -
注册会员
2022/5/12 6:50:35
标题:
How to access a values in Array of Integer/String created in a DLL - VCL 32bits test 浏览:188
加入我的收藏
楼主: How to access a values in Array of Integer/String created in a DLL - VCL 32bits test

--- RAD 11.1 Alexandria
--- DLL Delphi 32bits (for tests)
------ array of integer/string values...
--- Client Delphi 32bits
------ reviewing the values created on DLL

IMPORTANT OBSERVATION ON USE OF TYPE "MANAGEMENT" (like strings...)

{ Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters.

  Important note about VCL usage: when this DLL will be implicitly
  loaded and this DLL uses TWicImage / TImageCollection created in
  any unit initialization section, then Vcl.WicImageInit must be
  included into your library's USES clause. }
此帖子包含附件:
PNG 图像
大小:51.8K
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!
作者:
男 emailx45 (emailx45) ▲▲▲▲△ -
注册会员
2022/5/12 6:50:59
1楼: library prjArrayInDLL;

{ Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters.

  Important note about VCL usage: when this DLL will be implicitly
  loaded and this DLL uses TWicImage / TImageCollection created in
  any unit initialization section, then Vcl.WicImageInit must be
  included into your library's USES clause. }

uses
  Sharemem,   // <----------
  System.SysUtils,
  System.Classes,
  uUnitWithArrayFunction in 'uUnitWithArrayFunction.pas';

{$R *.res}

begin

end.
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!
作者:
男 emailx45 (emailx45) ▲▲▲▲△ -
注册会员
2022/5/12 6:51:15
2楼: unit uUnitWithArrayFunction;

interface

type
  TMyArrayIntegerToReturn = TArray<integer>;
  TMyArrayStringToReturn  = TArray<string>;

function MyArrayIntegerReturned: TMyArrayIntegerToReturn; // stdcall or cdecl; ?
function MyArrayStringReturned: TMyArrayStringToReturn;   // stdcall or cdecl; ?

exports          { }
  MyArrayIntegerReturned, { }
MyArrayStringReturned;

implementation

function MyArrayIntegerReturned: TMyArrayIntegerToReturn;
var
  MyArray: TMyArrayIntegerToReturn;
begin
  result := [];
  //
  for var i: integer := 0 to 100 do
    MyArray          := MyArray + [i];
  //
  result := MyArray;
end;

function MyArrayStringReturned: TMyArrayStringToReturn;
var
  MyArray: TMyArrayStringToReturn;
begin
  result := [];
  //
  for var i: integer := 65 to 122 do
    MyArray          := MyArray + [Chr(i) + '_HelloWorld'];
  //
  result := MyArray;
end;

end.
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!
作者:
男 emailx45 (emailx45) ▲▲▲▲△ -
注册会员
2022/5/12 6:51:43
3楼: program prjClientApp;

uses
  Sharemem,  // <----------
  Vcl.Forms,
  uView.FormMain in 'uView.FormMain.pas' {Form1};

{$R *.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1);
  Application.Run;

end.
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!
作者:
男 emailx45 (emailx45) ▲▲▲▲△ -
注册会员
2022/5/12 6:52:02
4楼: unit uView.FormMain;

interface

uses
  Winapi.Windows,
  Winapi.Messages,
  System.SysUtils,
  System.Variants,
  System.Classes,
  Vcl.Graphics,
  Vcl.Controls,
  Vcl.Forms,
  Vcl.Dialogs,
  Vcl.StdCtrls;

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

var
  Form1: TForm1;

implementation

{$R *.dfm}

type
  TMyArrayIntegerReturned = TArray<integer>; // same type in DLL
  TMyArrayStringReturned  = TArray<string>;
  TMyFuncInteger          = function: TMyArrayIntegerReturned; // stdcall or cdecl; ?
  TMyFuncString          = function : TMyArrayStringReturned;

var
  MyDLLFilePath          : string = 'D:\RADRX111Tests\__temp\ddl_arrays\OutputBin\prjArrayInDLL.dll';
  MyFuncArrayIntegerReturned: string = 'MyArrayIntegerReturned';
  MyFuncArrayStringReturned : string = 'MyArrayStringReturned';
  //
  MyFuncIntegerOnDLL: TMyFuncInteger;
  MyFuncStringOnDLL : TMyFuncString;

procedure TForm1.Button1Click(Sender: TObject);
var
  MyDLLHandle          : THandle;
  MyArrayIntegerReturned: TMyArrayIntegerReturned;
  MyArrayStringReturned : TMyArrayStringReturned;
begin
  MyDLLHandle         := 0;
  @MyFuncIntegerOnDLL := nil;
  @MyFuncStringOnDLL  := nil;
  //
  MyDLLHandle := LoadLibrary(PWideChar(MyDLLFilePath));
  //
  if (MyDLLHandle > 0) then
    try
      @MyFuncIntegerOnDLL := GetProcAddress(MyDLLHandle, PWideChar(MyFuncArrayIntegerReturned));
      @MyFuncStringOnDLL  := GetProcAddress(MyDLLHandle, PWideChar(MyFuncArrayStringReturned));
      //
      if Assigned(MyFuncIntegerOnDLL) then
      begin
        for var MyItem in MyFuncIntegerOnDLL do
          Memo1.Lines.Add(MyItem.ToString);
      end;
      //
      if Assigned(MyFuncStringOnDLL) then
      begin
        for var MyItem in MyFuncStringOnDLL do
          Memo2.Lines.Add(MyItem);
      end;
    finally
      FreeLibrary(MyDLLHandle);
    end;
end;

initialization

ReportMemoryLeaksOnShutdown := true;

finalization

end.
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!
作者:
男 emailx45 (emailx45) ▲▲▲▲△ -
注册会员
2022/5/12 6:53:44
5楼: now, if the values ar "stored on memory on DLL", just export the values like:

var
  // global access on DLL
 MyListValuesOrArray : ??? type

...

now, just create a function to export this variable !!!
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v2.1 版权所有 页面执行54.6875毫秒 RSS