上次的问题没人回答,问个关于pchar的问题!字符串加密有什么好方法?(对密码,可以是中文输入法,也可以是英文,数字) (50分)

  • 主题发起人 主题发起人 草原牧歌
  • 开始时间 开始时间

草原牧歌

Unregistered / Unconfirmed
GUEST, unregistred user!
在dll中
Library mydll;
uses ……相关单元;
function str(const str1:Pchar):PChar;stdcall;
var
str2:PChar;
i:integer;
begin
str2:=str1;
for i:=0 to Length(str1)-1 do
begin
str2:=chr(ord(str2)+1);
end;
Result:=str2;
end;
exports str;
在主程序中动态调用这个函数。
type
Tfunstr=function(str1:pchar):pchar;stdcall;
procedure TForm1.ButtonClick(Sender:Object);
var
h:Thandle;
funstr:Tfunstr;
begin
h:=LoadLibrary('mydll.dll');
if h<>0 then
begin
@funstr:=GetProcAddress(h,'str');
if @funstr<>nil then
self.edit2.text:=funstr(PChar(self.edit1.text));
freeLibrary(h);
end;
end;
str函数怎么总是没有返回值,或是返回值不是预期的,我在同一个程序中做就不会有问题。pchar和string的区别在哪了?哪有关于字符串的书籍下啊?
 
我听说oracle有时无法卸载,有时候要重装系统,不知是否属实?
 
再加50,不能再多了!
 
要说这个区别还是很难说明的,慢慢靠自己理解吧。大概说说PChar是指针,实际只是一个数值,表地址的数值,你那样str2:=str1,其实就是把str2指向原来str1指向的地址,但是内存中只是有一份空间存放字符。而其实string其实也是指针,只是它会另外分配一份空间保存字符的,假如str2是string的话,那样就会有两份空间存放字符了,如果str2=str1,则两份空间的内容一样的。按照你程序,我这样改改,你试试。

function str(const str1:Pchar):PChar;stdcall;
var
str2:PChar;
i:integer;
begin
str2:=str1;
for i:=0 to Length(str1)-1 do
begin
str2:=chr(ord(str2)+1);
end;
Result:=str2;
end;
 
string和pchar的区别可看下文,很详细
http://www.cx66.com/cxgzs/program/delphi/665.htm

 
在代码中这句好像有问题的
str2:=chr(ord(str2)+1);
应该是str2:=chr(ord(str2)+1);吧。

PChar是指针,是指向Char的指针。string是字符串。
一般情况下可以相互转换。
最大区别是存储方式不一样:(我是这样理解的)
如果PChar:='ABCD' string:='ABCD'
PChar[0]='A' Pchar[1]='B'...
而 String[1]:='A' String[2]:='B'。。。
String[0]好像存储的是string的长度。PChar以#0结束

 
按楼上的方法修改后试过没问题
 
pchar本身没有长度信息,靠#0结尾控制,所以中间不能有#0,
pchar内存管理跟borland的内存分配体系有些差异,所以borland建议用到pchar的动态库要在库和宿主中加uses sharemem;
 
我的这句确实写错了,应该是str2:=chr(ord(str2)+1);
如果把上句改成str2:=chr(ord(str2)+11)
在程序中输入:“暗暗啊”,或“暗暗暗暗”,试一试加密效果,和解密效果,解密时str2:=chr(ord(str2)-11);
是不是有很大出入啊?string 类型就不会出问题!
 
同意JamesBond_L的说法
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
679
import
I
后退
顶部