delphi中调用VC++做的dll中字符串显示问题

Ansha 2003-07-04 04:16:06
我做了一个测试程序
用VC++做的dll函数原型:DES_Copy(char *Out,char *In)
功能很简单,从in接受字符串,赋给out.
在delphi中声明:
function DES_Copy(outf,inf:pchar):boolean; stdcall;

implementation
function DES_Copy;external 'ceshi.DLL' name 'DES_Copy';

调用:
procedure TForm1.Button1Click(Sender: TObject);
var
inf,outf:pchar;
ins,outs:string;
begin
outs:='';
ins:=edit1.Text;
outf:=pchar(outs);
inf:=pchar(ins);
DES_Copy(outf,inf);
edit2.Text:=outf;
end;

我在edit1中打了一串字符后点button1,edit2中为什么什么也没有呢?有谁能告诉我吗?
...全文
76 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ansha 2003-07-09
  • 打赏
  • 举报
回复
不行!还是什么都没有!
Ansha 2003-07-09
  • 打赏
  • 举报
回复
不行!什么也没有变!还是什么都出不来!
Ansha 2003-07-09
  • 打赏
  • 举报
回复
可是我用整形变量做参数的时候,就可以啊!不会用了指针就不能导出类的成员函数了吧!我去试试!
Ansha 2003-07-08
  • 打赏
  • 举报
回复
to jacky_shen(jacky):对不起,我的dll是用VC++编的,不是delphi。而这个程序就是为了测试在delphi中调用VC的dll的情况。问题也就在这里...
jacky_shen 2003-07-08
  • 打赏
  • 举报
回复
程序内容
--------

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

function des_copy(pIn: PChar; var pOut: PChar): Boolean; stdcall; external 'OutIn_DLL.dll';

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
pOut: PChar;
begin
des_copy(PChar(Edit1.Text), pOut);
Edit2.Text := pOut;
end;

end.

DLL内容
--------

library OutIn_DLL;

{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }

uses
SysUtils,
Classes;

{$R *.RES}

function des_copy(pIn: PChar; var pOut: PChar): Boolean; stdcall;
begin
pOut := pIn;
Result := True;
end;

exports
des_copy;

begin
end.
Ansha 2003-07-08
  • 打赏
  • 举报
回复
to howwise(Icold) :你的程序运行出错,说是“有缺陷的指针”??
howwise 2003-07-08
  • 打赏
  • 举报
回复
edit2.Text:=strpas(outf);刚学DELPHI,试试吧!字符不多的时候,应该没有问题,会把字符传回来,或者不加,GETMEM(),FREEMEM(),不知道会不会有内存泄露。
howwise 2003-07-08
  • 打赏
  • 举报
回复
function DES_Copy(var outf,inf:pchar):boolean; stdcall;
...
procedure TForm1.Button1Click(Sender: TObject);
var
inf,outf:pchar;
ins,outs:string;
begin
getmem(inf,5120);
getmem(outf,5120);
outs:='';
ins:=edit1.Text;
outf:=pchar(outs);
inf:=pchar(ins);
DES_Copy(outf,inf);
edit2.Text:=strpass(outf);
freemem(inf);
freemen(outf);
end;

Ansha 2003-07-08
  • 打赏
  • 举报
回复
To liumengchuan():不对!我发现出来的东西不是ins的内容!是setlength()后,outs里就有的!若是设了outs:='',就又什么都没有了!为什么会这样??
liumengchuan 2003-07-08
  • 打赏
  • 举报
回复
delphi从入门到精通(随便哪个版本),里面详细讲了delphi的字符串,你可以详细看一看。
由于C对字符串的处理方式与ob不同,所以在处理的时候,一定要弄清楚你要操作的内存中的数据到底是什么样的结构。
ob的String类型其实是非常好用的,我经常用@S[1]来用做输入、输出参数。尤其是在调用win api的时候。但是你一定要清楚某个api与这种使用方式会不会有冲突。
Eastunfail 2003-07-08
  • 打赏
  • 举报
回复
导出类的成员函数????不会吧,估计你的错误就出在那里。因为在调用类的成员函数的时候,通常还要将this指针压栈,所以导致你在Delphi中调用错误。尝试一下使用静态成员函数或者不要在类中导出
jacky_shen 2003-07-08
  • 打赏
  • 举报
回复
那个道理是一样的,只是一个是
Object Pascal
一个是
C++。

意思是一样的。
Ansha 2003-07-08
  • 打赏
  • 举报
回复
vc的源程序:
__declspec(dllexport) bool CDes::DES_Copy(char *Out,char *In)
{
Out=In;
return true;
}

大家帮忙看看问题到底出在哪里了,谢谢!
Eastunfail 2003-07-07
  • 打赏
  • 举报
回复
你在VC中是怎么定义那个函数的?
Eastunfail 2003-07-07
  • 打赏
  • 举报
回复
const char *sk=0

:


const sk:PChar=nil
Ansha 2003-07-07
  • 打赏
  • 举报
回复
To liumengchuan() :真是太感谢了,这下总算是有东西出来了!我还想请问一下,如果有C++参数constchar *sk=0,在delphi中又怎么用呢?还有你说注意处理长度的问题,可以告诉我有哪些较好的参考资料吗?我是新手,我不懂的。谢谢!分我一定会给的。
liumengchuan 2003-07-07
  • 打赏
  • 举报
回复
对了,还要记得c语言里的字符串与pascal不一样噢
主要要注意处理长度的问题
liumengchuan 2003-07-07
  • 打赏
  • 举报
回复
看我的
begin
//outs:='';
setlength(outs, 2048);
ins:=edit1.Text;
DES_Copy(@outs[1],@ins[1]);
edit2.Text:=outf;
end;
mahatma_cn 2003-07-06
  • 打赏
  • 举报
回复
好像要先为你的“outf,inf:pchar”分配空间再调用dll中的函数
nydelphi 2003-07-06
  • 打赏
  • 举报
回复
up
学习
加载更多回复(5)

5,390

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧