dll问题(本站所有相关的贴我看过了)(300分)

  • 主题发起人 主题发起人 螃蟹
  • 开始时间 开始时间

螃蟹

Unregistered / Unconfirmed
GUEST, unregistred user!
我在vfp中调用一个delphi写的dll文件.
其代码如下
代码:
PROCEDURE firstdata
 PUBLIC CBUFF , RESUU
 *--以下是调用dll的声明,函数为GS_MHDog,dll文件为win32dll.dll
 DECLARE INTEGER GS_MHDog IN win32dll STRING @   
 *--初始化变量
 CBUFF = SPACE(256)
 CH1 = CHR(4)
 CH2 = CHR(0)
 CBUFF = STUFFC(CBUFF,1,1,CH1)
 CBUFF = STUFFC(CBUFF,2,1,CH2)
 CBUFF = STUFFC(CBUFF,3,1,CH2)
 CBUFF = STUFFC(CBUFF,4,1,CH2)
 CH1 = CHR(10)
 CBUFF = STUFFC(CBUFF,5,1,CH1)
 CBUFF = STUFFC(CBUFF,6,1,CH2)
 CBUFF = STUFFC(CBUFF,9,1,CH2)
 CBUFF = STUFFC(CBUFF,10,1,CH2)
 CBUFF = STUFFC(CBUFF,11,1,CH2)
 CBUFF = STUFFC(CBUFF,12,1,CH2)
 STR1 = 'NcdJ'
 CBUFF = STUFF(CBUFF,17,20,STR1)
ENDPROC
*------
PROCEDURE checkdata
*---调用dll中的函数
RESUU = GS_MHDOG(@CBUFF)
messgebox(cbuff)
ENDPROC
*------

delphi写的dll代码如下
代码:
library win32dll;
uses
ShareMem,Messages,windows,
Dialogs,SysUtils,Classes;
//vfp调用的函数
function GS_MHDog(str_mh:pchar):integer;cdecl;
begin
showmessage('dll原始:'+str_mh);
str_mh:='adfkjaf';
showmessage('dll修改后返回前'+str_mh);
Result:=0;
end;
exports
 GS_MHDog;
begin
end.

现在的问题是我在vfp收到的值无论怎么做也没有办法改变
也就是在vfp中虽然是传送的指针,但我在dll中对起内容的改变是没有效果的.没有用,
还在vfp退出的时候报个内存读写错误.
谁知道这是什么原因吗.

以下是我已经在delphi中尝试过的方法.
function GS_MHDog(str_mh:pchar):integer;cdecl;
function GS_MHDog(str_mh:pchar):integer;stdcall;
以上两个声明能调用,但不能改变cbuff的内容.
function GS_MHDog(var str_mh:pchar):integer;stdcall;
vfp报参数错误.

但如果这个dll改用cb来写就没有任何问题.
各位帮帮忙看看症结在什么地方.

问题二'
同样是那个dll文件
如果要在delphi程序中调用.如果想要在dll改变pchar的内容.则要求声明为
function GS_MHDog(var str_mh:pchar):integer;stdcall;
才可以.这是什么道理.
 
这里
str_mh:='adfkjaf';
改为
StrPCopy(str_mh,'adfkjaf')


 
真的感谢了.我为这个问题郁闷了整整一天.想不到结果如此简单.感谢感谢.
 
首先,你只能改变指针指向的内容,而不能改变指针本身
在Dll中 str_mh:='adfkjaf'
实际上是修改了指针本身,让其指向了一个新的地址,但因为其参数不是var,所以形参的修改不会影响实参,最终是什么也没有改变
问题二,和上面是类似的,加上var后,形参的改变即是实参的改变,调用函数后指针指向了新的地址,ShowMessage显示出来也是没有错误的,但我们丢失了指针原来指向的内容,造成了内存泄漏。。。
正确的方法如 tseug 所说的就可以
 
在多问一句,如果那个传如的传很长,我就想改动他的第10位,该怎么做呢.
 
说明:tseug所说有些问题 StrPCopy(str_mh,'adfkjaf');
1.strpcopy不进行内存长度检测,如果不够就会出错
2.如果在dll内对STR_MH分配内存那么当退出DLL时,内存要FREE掉才好
3.如果在外面对形参分配内存并负责FREE也不方便
所以我认为形参设为VAR传地址,还返回时, 形参 := PCHAR(内部字串变量)是可行的
因为将string cast to pchar DELPHI所做的事情就是将 STRING的内容COPY到形参,这样
形参的内容就改变了,也没ALLOCAMEM &amp
FREEMEM的麻烦
问题是pchar的类型VB的STRING支持不是很好,有时传到VB后,他后面会有一些空值,用VB的TRIM也截不掉,但只要给VB的EDIT,再从EDIT取值就正常了,这一点我现在也不太明白???
 

Similar threads

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