大虾来看看:Delphi调用VC++的dll问题(100分)

A

Ansha

Unregistered / Unconfirmed
GUEST, unregistred user!
希望对edit1中的内容加密,显示在edit2中。用Delphi调用VC++的dll来实现。
在C中函数定义DES1_Encrypt(char *Out,char *In,UINT len,const char *KeyStr=0);
delphi中声明:
const DES:pchar ='123';
function DES1_Encrypt(OutText,InText:pChar;
Len:INTEGER;const DES:pChar):Boolean;stdcall;
delphi的源程序:
procedure TForm1.Button1Click(Sender: TObject);
var
OutTextS,InTextS,test:string;
OutText,InText:pchar;
len:INTEGER;
begin
GetMem(OutText,256);
ZeroMemory(OutText,256);
GetMem(InText,256);
ZeroMemory(INText,256);
test='';
OutTextS:='';
InTextS:=edit1.text;
OutText:=Pchar(OutTextS);
InText:=Pchar(InTextS);
len:=length(InTextS);
Unit2.DES1_Encrypt(OutText,InText,len,DES);
SetString(test,PChar(OutText),length(OutText));
edit2.Text:=test;
end;
运行之后edit2中什么也没有,那位大虾能告诉我为什么??谢谢!
 
調試看看各變量是否對先~~
另外﹐這個函數是否真的可以的﹖好像函數定義有點問題﹐都沒有指定函數所在的dll。
 
是否应该是这样的 outtext是返回修改后的文字
function DES1_Encrypt(var OutText : Pchar;InText:pChar;
Len:INTEGER;const DES:pChar):Boolean;stdcall;
 
To JamesBond_L :我有指定,只是没有贴上来,因为我能肯定那部分是正确的。我是先用一个小程序作过测试,是正确的。只是那个程序的参数都是整形变量。
To realLearning :eek:uttext的确是返回修改后的文字。但加上var并不行,我试过了,还是老样子,什么都没有。
不知道问题出在哪了,帮忙再看看,谢谢!
 
最好把C写的DLL贴上些代码...
根据那一点代码,好像应该是Delphi的声明应该是
function DES1_Encrypt(OutText,InText:pChar;
Len:INTEGER;const DES:pChar):Integer;cdecl;
 
To tseug:用cdecl是不行的,应该不是这方面的问题。我用整形变量做过测试,运行正常。
 
什么意思? 整形变量如何测试的, 可否把代码贴上来。 如果你的DLL没有问题, 那么
应该是声明的问题,也许和缺省参数有关。。。
function DES1_Encrypt(OutText,InText:pChar;
Len:INTEGER;const DES:pChar=nil):Integer;
stdcall;
另外看了你的代码,
GetMem(OutText,256);
这样用是不对的,应该是用SetLength(OutText, 256),
还有,调用时应该这样
Unit2.DES1_Encrypt(PChar(OutText), PChar(InText),len, DES);
并且你的DES变量既不知道类型也没有初始化。。。
 
to tseug:改成setlength()设置长度并把参数强制转为pchar型后,的确是有东西出来,不过不是原先intext的内容,好像是在使用了setlength()后,outtext中就已有的内容。若是事先设置了outtext:='',就又什么都没有了!为什么?
 
delphi的源程序这样写:
procedure TForm1.Button1Click(Sender: TObject);
var
OutText,InText:pchar;
begin
GetMem(OutText,256);
ZeroMemory(OutText,256);
GetMem(InText,256);
ZeroMemory(INText,256);
StrPCopy(OutText, edit1.Text);
Unit2.DES1_Encrypt(OutText,InText,length(Edit1.Text),DES);
edit2.Text:=OutText;
FreeMem(InText);
FreeMem(OutText);
end;
 
to barton:不对!你直接把edit1里的内容赋给outtext了!改成intext后还是什么都没有!
 
哦,笔误,笔误。
这样算了:
procedure TForm1.Button1Click(Sender: TObject);
var
OutText,InText:array[0..255] of Char;
begin
ZeroMemory(OutText,256);
ZeroMemory(INText,256);
StrPCopy(InText, edit1.Text);
Unit2.DES1_Encrypt(OutText,InText,length(Edit1.Text),DES);
edit2.Text:=OutText;
end;
 
to barton:编译不通过,数组和指针类型不匹配!
 
前面加个@。
 
to barton:还是什么都没有。
 
那显然,要不然就是你的函数内部有误,要不然就是参数问题。在DLL中调用串加密解密我
用过多了,没有这么多问题的。
 
没有人能帮我吗???:(
 
你只需要试试以下代码就知道你的错误在哪里了:
procedure TForm1.Button1Click(Sender: TObject);
var
OutText,InText:pchar;
begin
GetMem(OutText,256);
ZeroMemory(OutText,256);
GetMem(InText,256);
ZeroMemory(INText,256);
StrPCopy(InText, edit1.Text);
//Unit2.DES1_Encrypt(OutText,InText,length(Edit1.Text),DES);
StrLCopy(OutText, InText, length(Edit1.Text));
edit2.Text:=OutText;
FreeMem(InText);
FreeMem(OutText);
end;
如果能够显示很显然就是你的函数部分有问题。这是简化问题的基本方法。
如果结果是你的函数问题,又没有相关的源码,大家怎么帮你?
 
对于String类型的变量,SetLength就给他分配了空间,你可以用FillChar或者ZeroMemory
来清空它的内容,不要用赋值的办法,那样会影响它的长度。
当你调用你的DLL中函数后
还要调用
SetLength(OutText, StrLen(PChar(OutText)));
来调整为实际的长度,当然如果你能确保加密后长度和加密前一样也可以不调整。

大概来说就是这样的
procedure TForm1.Button1Click(Sender: TObject);
var
OutText,InText : String;
begin
InText := edit1.text;
SetLength(OutText, 256);
//或者 SetLength(OutText, Length(InText));
Unit2.DES1_Encrypt(PChar(OutText), PChar(InText), Length(InText),DES);
SetLength(OutText, StrLen(PChar(OutText)));
edit2.Text:=OutText;
end;

 
to barton:用你这段代码测试的确能显示,但那个函数在vc上调用是可以的呀!关键在于delphi调用vc(还要是指针),还有什么讲究没。不是我不公开函数,问题是那不是我做的...
to tseug:出来的是没有清空的内容,在setlength()这一句后就有了的。zeromemory的参数是pchar型...
 
基本上可以肯定你的函数在Delphi中的dll声明有问题。参考tseug等前述的试试。
原型:
DES1_Encrypt(char *Out,char *In,UINT len,const char *KeyStr=0);
Delphi声明:
function DES1_Encrypt(OutText,InText:pChar;
Len:INTEGER;const DES:pChar):Boolean;stdcall;
[red]有点不符啊老兄。[/red]
改成这样试试:
function DES1_Encrypt(const OutText,InText:pChar;
Len:INTEGER;const DES:pChar):Boolean;stdcall;
 
顶部