DLL 没用string 怎么还提示delphi invalid pointer operation

fscnt 2009-12-05 01:27:23
//调用程序
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TStrArr = array of Pchar;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
type
TDllReadCard = function(): TStrArr; stdcall;
var
DllReadCard: TDllReadCard;
DLLHandle: THandle;
sStrArr: TStrArr;
begin
SetLength(sStrArr, 10);
DLLHandle := LoadLibrary('Project2.dll');
if DLLHandle <= 0 then
raise Exception.Create('加载Project2.dll失败!');
@DllReadCard := GetProcAddress(DLLHandle, 'FDLL');
if not (@DllReadCard = nil) then
begin
sStrArr := DLLReadCard();
end;
edit1.Text := sStrArr[2];
end;
end.


dll程序
library Project2;

uses
SysUtils,
Classes;
type
TStrArr = array of Pchar;

{$R *.res}

function FDLL(): TStrArr; stdcall;
var
sResult: TStrArr;
begin
SetLength(sResult, 10);
sResult[1] := Pchar('是');
sResult[2] := Pchar('否');
Result := sResult;
end;

exports
FDLL;
begin

end.
...全文
417 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
liangpei2008 2009-12-05
  • 打赏
  • 举报
回复
string与动态数组原理是一样的,需要加ShareMem!
要不你就用静态数组
fscnt 2009-12-05
  • 打赏
  • 举报
回复
我是要返回一个数组..
yumenyoudian 2009-12-05
  • 打赏
  • 举报
回复
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TStrArr = array of Pchar;
var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
type
TDllReadCard = procedure(var StrAyy: TStrArr); stdcall;
var
DllReadCard: TDllReadCard;
DLLHandle: THandle;
sStrArr: TStrArr;
begin
DLLHandle := LoadLibrary('Project2.dll');
if DLLHandle <= 0 then
raise Exception.Create('加载Project2.dll失败!');
@DllReadCard := GetProcAddress(DLLHandle, 'FDLL');
SetLength(sStrArr, 10);
if not (@DllReadCard = nil) then
begin
DLLReadCard(sStrArr);
end;
Caption := sStrArr[2];
end;
end.


library Project2;

{ 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. }

uses
SysUtils,
Classes;

type
TStrArr = array of Pchar;

{$R *.res}

procedure FDLL(var AStrArr: TStrArr); stdcall;
var
sResult: TStrArr;
n, nlength: Integer;
begin
nlength := length(AStrArr);
for n := 0 to nlength - 1 do
begin
if n = 1 then
AStrArr[n] := Pchar('是');
if n = 2 then
AStrArr[n] := Pchar('否');
end;
end;

exports
FDLL;
begin

end.
fscnt 2009-12-05
  • 打赏
  • 举报
回复
没明白你的意思。
Seamour 2009-12-05
  • 打赏
  • 举报
回复
是没用长字符串类型,但你用动态数组不一样么
fscnt 2009-12-05
  • 打赏
  • 举报
回复
怎么没人理我。都放假了吗
内容概要:本文档为《PCI Express CEM Specification, Revision 5.0, Version 1.0》的技术勘误表(Errata),发布于2021年8月3日,共包含21项修订记录。主要针对原规范中的文本错误(TXT)、术语使用不当或格式问题进行修正,涉及信号定义、材料要求、尺寸参数、表格引用、注释说明等多个技术细节。部分修改明确了关键信号如SENSE0/SENSE1的使用条件,调整了连接器测试夹具推荐做法,并统一了术语表述以避免歧义。所有修订均经过CEM工作组讨论确认,其中多数已被采纳(绿色标记),个别仍需进一步讨论(橙色标记)。; 适合人群:从事PCIe接口设计、高速电路开发、硬件合规性测试的工程师及相关技术人员;熟悉PCIe标准并参与硬件产品开发的1-3年经验研发人员。; 使用场景及目标:①帮助开发者准确理解PCIe CEM规范中关于高功率连接器、边带信号、PCB布局等关键技术要求;②指导硬件设计与测试过程中规避因文档歧义导致的实现错误;③确保产品符合最新规范版本的电气与机械设计标准; 阅读建议:此资源为规范性文件的补充修正,建议结合原始CEM Specification文档对照阅读,重点关注标红、标绿和标橙的反馈状态,及时更新设计依据,并在实际项目中验证相关修改项的应用一致性。
内容概要:本文是一份针对全国计算机等级考试(NCRE)二级的全面备考指南,覆盖MS Office高级应用与设计、C语言程序设计和Python语言程序设计三大主流科目。文档按照“认知→题库→实战→冲刺”四步递进结构组织,系统介绍了考试基本信息、报名时间、考试形式、合格标准及科目选择建议,并深入剖析各科高频考点、真题规律与操作技巧。重点内容包括MS Office中的Word长文档排版、Excel函数应用与PPT动画设计;C语言中的指针、数组、函数及程序调试;Python中的基础语法、标准库(如turtle、random)与第三方库(如jieba、wordcloud、matplotlib)的应用。此外,还提供公共基础知识精讲、操作题逐步教学、易错题集锦、模拟软件使用指南和科学的时间管理策略,帮助考生高效备考。; 适合人群:零基础小白、临考突击型考生以及多次未通过的考生,尤其适合非计算机专业希望提升办公技能或理工科学生准备编程语言认证的学习者。; 使用场景及目标:①系统掌握NCRE二级考试所需的知识与实操技能;②通过刷真题、模拟考试和错题复盘提高应试能力;③在短时间内实现从入门到通关的跨越,一次性通过考试。; 阅读建议:建议按文档顺序逐步学习,结合官方考纲和真题进行实践操作,重视动手练习而非仅理论阅读,临考前使用模拟软件全真演练,强化时间分配与答题策略。

5,943

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧