dll和指针等三个问题 (50分)

  • 主题发起人 主题发起人 haha2008haha
  • 开始时间 开始时间
H

haha2008haha

Unregistered / Unconfirmed
GUEST, unregistred user!
问题1
有个dll有很多函数,有几个unit都要使用,我想在一个unit中静态调用声明一下,这样其它unit
只要把这个单元包括进就行了,不需要重新声明。可是我在interface中声明总是报错,
在implement中声明别的单元访问不了,怎么办?
2 一个real数组p,一个结构体k,k的成员中有char类型数组,有real类型的
已知p的长度是sizeof(k)+sizeof(real)*256,里面存有数据,数据头既是一个k类型的
其余是256个real类型的数据,怎么把他们分别取出?


下面是我的答案,有问题,各位讨论以下

问题1:
type
char5=array[1..5] of char
real256:array[1..256] of real
pk=^k;
pr=^real;
pInt64=^Int64;

k=record
c:char5;
realc:real;
t:Int64;
end;

p:real256; //存储有数据
AC:pc;
Ar:Pr;
F:char;
F1:Int64;
F2:real;
FTemp:Integer;
AInt64:Pint64;
AC=pchar(@p);
F:=AC^; //k中c[0]
FTemp:=sizeof(real)+5*sizeof(char);
inc(p,FTemp);
F1:=PInt64(p)^; //k中t
FTemp:=sizeof(Int64);
Int(p,FTemp);
F2:=PR(p)^; //k后第一个real类型的数据
第一个问题的,我按张无忌大侠写的,那几个注释的地方写的对吗?


问题2

声明语句:function init(F:Pchar):Integer;stdcall;external 'jn.dll';

单元语句
unit Unit3;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm3 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
//位置1
end;
//位置2
var
Form3: TForm3;

implementation

{$R *.dfm}
//位置3
end.

位置2和3都成功,2时别的单元可以访问,1不行,
[Error] Unit1.pas(33): Field definition not allowed after methods or properties
[Error] Unit1.pas(34): Type expected but 'END' found
[Error] Unit1.pas(33): Unsatisfied forward or external declaration: 'TForm3.INIT'
[Fatal Error] Unit1.pas(6): Could not compile used unit 'Unit3'
同时,要声明一个每个单元都可以访问的全局变量,而不需要引用单元,需要在什么地方声明,全局函数呢,我想在程序运行时初始化一个
全局变量,然后其它模块可以直接调用。


问题3:以前的问题,有大侠已经解决,我担心自己愚顿理解错了,写一下,麻烦看看
vc:
union{
char t[30];
float a;
long k;
char *p;
}u

Delphi:
type
char30=array[1..30] of char;

u=record
case Integer of
0:(t:char30);
1:(a:real);
2:(k:LongInt);
3:(p:Pchar);
end;

不知这么作对否?
对于Vc里的char类型数组,Delphi里对应的Pchar和array[1..len] of char都行吗?


 
1.
unit Unit1;

interface

procedure ABC; stdcall; external 'abc.dll' name 'ABC';

implementation

end.
如果报错看是不是你的函数有没有声明的类型之类的

2.
2.1
基本没错
FTemp:=sizeof(real)+5*sizeof(char);
inc(p,FTemp);
F1:=PInt64(p)^; //k中t
FTemp:=sizeof(Int64);
Int(p,FTemp); //是Inc,如果是的话,那么此时p指向下一个k结构体,下面的语句应该是错误的
F2:=PR(p)^; //k后第一个real类型的数据


2.2
1. 其他单元访问,首先需要uses Form3,访问Form3.Value,如果Value定义成private变量,其他单元如果也无法访问
2. user Form3; 直接访问Value
3. 其他单元无法访问,只可能是本单元定义此变量位置以后的代码才可访问

全局变量及函数声明在 interface 与 implementation 之间

3. 没写错
但array[1..len] of char不能用pchar代码,pchar只是一个指向char型的指针,占一个字长的位置
 
我已经劝过haha2008haha了,人家偏偏不信.
 
LeeChange,不是我不信,只是从没用过Delphi,总是弄不明白,很糊涂,抱歉了
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部