DLL 字符串 Pointer 赋值问题! ( 积分: 100 )

W

wqy888

Unregistered / Unconfirmed
GUEST, unregistred user!
下面例子可以正常执行
procedure TForm1.Button2Click(Sender: TObject);
var strData:String[50];
pData:pointer;
begin
strData:= 'Delphi';
pData:= @strData[1];
edit2.Text:=strpas(pData);
end;

但我想把这函数写在DLL里面调用 如下:
procedure TForm1.Button2Click(Sender: TObject);
var strData:String[50];
pData:pointer; //必须用无类型
CMD,RCode:integer;
begin
CMD:=1; //CMD不同返回的字符串不同
RCode:=MyDll(CMD,pData); //RCode返回不同的数值以执行不同的命令
edit2.Text:=strpas(pData);
end;

实验了1天了也没测试成功这个DLL 请教高手这个DLL怎么写啊!
 
在DLL里可以用PChar作为字符串指针,也可以加ShareMem到DLL的工程头直接用string。
你这个问题不好理解,太不详细了,帮不了你。
 
RCode:=MyDll(CMD,pData); //RCode返回不同的数值以执行不同的命令
------------------
一般的 DLL 都不这样处理,(当然不是说这样处理不了)

一般是这样做的,很多 Win32API 都是这样做的,如 GetWindowsSysDir

它由客户程序申请一段内存,把内存指针与数据长度传给 DLL,DLL 对内存赋值

如你的程序可以写成这样。


var
strData:array[0..4096] of char;
CMD,RCode:integer;
begin
CMD:=1; //CMD不同返回的字符串不同
RCode:=MyDll(CMD,@strData[0], 4096); //RCode返回不同的数值以执行不同的命令
edit2.Text:=strpas(@strData[0]);
end;

DLL 函数的申请是这样的
function MyDLL(cmd:integer; Buf:pointer; BufLen:integer):integer;

DLL 是这样实现

function MyDLL(cmd:integer; Buf:pointer; BufLen:integer):integer;
var
s :string;
begin
Result := 0;
if Buf = nil then exit;
case cmd of
.....
end;

if length(s) > buflen then exit;
StrPCopy(buf, s);
Result := length(s);
end;

--------------------------
明白没?
 
QSmile 朋友答案正确 调试成功!在这献上我深深的祝福!

http://community.csdn.net/Expert/topic/5590/5590167.xml?temp=.2030908
这也领一下分哦[:D]
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
780
import
I
I
回复
0
查看
608
import
I
顶部