繁体中文
高级搜索
 
首页 | Web | Java | VC/MFC | VB | Delphi | C/C++ | C++ Builder | 其他开发语言 | .NET技术 | 移动平台 | MSSQL | PowerBuilder | DB2 | Oracle | 其他数据库开发 | Linux/Unix社区 | 多媒体/设计 | 硬件/嵌入开发 | Windows专区 | 硬件使用 | 软件培训/认证/考试

当前位置:首页 >> Delphi >> 语言基础/算法/系统设计 >> 自已写DLL及调用DLL的程序,DLL的一个函数有一个输入参数和一个PCHAR型输出参数,怎么不成功?
自已写DLL及调用DLL的程序,DLL的一个函数有一个输入参数和一个PCHAR型输出参数,怎么不成功?
作者:   来源: 发表时间:2007-01-11  字号:  

自已写DLL及调用DLL的程序,DLL的一个函数有一个输入参数和一个PCHAR型输出参数,下面是我写的,我的本意是按下按键后显示27个“t”,(但调用部分的函数输出参数P1不用VAR关键字)。怎么不成功?我对指针不熟,请大家帮试一下。

//DLL 部分:---------------
procedure getp(aa:integer;var p1: pchar);
var
i: integer;
//mybytearray: array [0..27] of char;
begin
{for i := 0 to 27 do
mybytearray[i] := 't';
p1 := @mybytearray; 这样也不行}

for i := 0 to 27 do
p1[i] := 't';
end;

exports
getp;

//调用DLL 部分:---------------
procedure getp(aa:integer;p1: pchar); stdcall;external 'dllf.dll'; //此处不用VAR p1:Pchar

var
Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
array2: array [0..27] of char;
begin
getp(2,array2); //请不要改变array2的定义及此句
label1.Caption := '';
for i := 0 to 27 do
label1.Caption := label1.Caption array2[i];
end;


gzmhero(hihihi) 于 2005-3-4 12:37:58
getp函数中:

for i := 0 to 27 do
mybytearray := 't';
// p1 := @mybytearray;////这里不对,mybytearray是函数的局部变量,函数返回,变量会释放.而这里的赋值是把指针p1指向了mybytearray。改成下面这样把变量mybytearray的内容拷贝到指针p1指向的空间里,就可以了。
copymemory(p1,@mybytearray,27);
end;
stall(蜡笔小新) 于 2005-3-4 13:06:36
试了一下gzmhero的方法,好像编译通过了,但按下按键后系统提示出错。
(另外补充一下,在前面我的意思可能没讲清楚,我是想调用函数的程序不变,改DLL来实现我的功能。谢了)
xwhope(烟火) 于 2005-3-4 13:10:24
getp里的那个参数,aa是整什么用呢?
wuyu1981(方圆) 于 2005-3-4 13:14:52
copymemory(p1,@mybytearray,27);=> copymemory(p1,@mybytearray,28);


gzmhero(hihihi) 于 2005-3-4 13:39:02
对,没看,长度有问题,应该拷贝28个字节的数据就可以了。
stall(蜡笔小新) 于 2005-3-4 14:06:28
已经试过了,用28也不行呀。另外AA是另一个输入变量,为了方便,用到它的地方我没贴上来。
gzmhero(hihihi) 于 2005-3-4 14:33:44
dll做修改就行了:
procedure getp(aa:integer;var p1: pchar);
var

----------------------->>>>>>>>>>>>>>>>
procedure getp(aa:integer;var p1: pchar);stdcall;
var
gzmhero(hihihi) 于 2005-3-4 14:35:50
或者改成:关键是stdcall,参数的顺序要和调用的函数一致,否则会地址异常。
procedure getp(aa:integer;p1: pchar);stdcall;
var
i: integer;
mybytearray: array of char;
begin
setlength(mybytearray,28);
for i := 0 to 27 do
mybytearray[i] := 't';
copymemory(p1,mybytearray,28);
end;

stall(蜡笔小新) 于 2005-3-4 15:20:26
成了,多谢gzmhero,
另外:但不知为何
var
i: integer;
mybytearray: array [0..27] of char; 编译却通不过

gzmhero(hihihi) 于 2005-3-4 15:25:21
那就要
copymemory(p1,@mybytearray,28);

caiso(十年磨一剑) 于 2005-3-4 15:30:15
顶一下

!注意:如果您发现此文章出现影响您的阅读的状况,请从浏览器地址栏里复制本文的链接到留言本报告给站长解决!
  • 上一篇: 流创建遇到异常的问题
  • 下一篇: 我一个简单的数据库连接函数,以Index.asp命名,可以正常连接,但我以conn.asp命名的时候,以#include 过来

  • >> 联系我们请给我们留言·留言本
    本站所有提供的信息软件资料均来自网络,版权及著作权归原作者所有,如果无意中侵犯了您的相关权利或触及法律法规,请给我们留言, 我们将在24小时内删除。
      浙ICP备06029577号  程序员贴吧