您的位置:程序门 -> delphi ->



关于dll的问题


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


关于dll的问题[已结贴,结贴人:yhyhai]
发表于:2007-11-05 11:49:31 楼主
我做了一个dll里面只发布一个涵数;
//************************
在dll中是这样定义的(里面封装了窗体):
...................
library   project1;

uses
    unit1   in   'unit1.pas';
exports
  dddd;
begin
end.
//涵数定义如下
function   ddd(   filename:pchar;field_index:integer):pchar;
var
input_form:tinput_code_form;
begin
input_form:=tinput_code_form.createform(filename,field_index);
with   input_form   do
  begin
  if   showmodal   =   mrok   then   result:=pchar(input_form.label1.caption)
  else   result:='';
  end;
end;

//***********************************************
我用程序调用;
.......
implementation
function   dddd(filename:pchar;field_index:integer):pchar;stdcall;external'project1.dll';//功能是返回一个人的姓名;
{$r   *.dfm}
procedure   tform1.edit1keydown(sender:   tobject;   var   key:   word;
    shift:   tshiftstate);
begin
if   key=vk_f9   then
    showmessage(dddd(pchar('c:\sy\person_id.ctd'),0));
end;
程序能够正常运行;
但是会出现一个奇怪的现象;
当返回的姓名是三个字的是侯就回出现如:原来是"杨伧林"会显示为
"杨伧   ",好象是被截断了半个字符,但是有时侯又能正常显示"杨伧林"
真不知道是什么原因?请给解释一下?
发表于:2007-11-05 11:56:241楼 得分:5
简单改法
返回值用string
发表于:2007-11-05 13:44:572楼 得分:5
导出:
function       ddd(       filename:pchar;field_index:integer):pchar;   stdcall;
发表于:2007-11-05 14:09:263楼 得分:0
to   楼上的
我不想用string;因为string只能用在delphi编的程序中;
请问budded  
导出:  
function               ddd(               filename:pchar;field_index:integer):pchar;       stdcall;
是什么意思?不明白
发表于:2007-11-05 14:24:254楼 得分:5
带上borlandmm.dll   用string吧,问题应该在这里。
发表于:2007-11-05 14:58:285楼 得分:0
如果带上borlandmm.dll用string的话用其它语言编的程序能调用这个dll吗?
我想知道的是为什么pchar就不行?
发表于:2007-11-05 15:08:276楼 得分:5
你必须在函数里面申请一段空间然后将返回值赋值给这个返回值.
或者使用参数返回.
发表于:2007-11-05 15:17:467楼 得分:0
to   akirya  
能具体一点吗?
发表于:2007-11-05 16:33:188楼 得分:5
大概是这样写的,不太会写delphi

function       ddd(       filename:pchar;field_index:integer):pchar;
var
input_form:tinput_code_form;
temp:pchar;
begin
input_form:=tinput_code_form.createform(filename,field_index);
with       input_form       do
    begin
    if       showmodal       =       mrok       then       result:=pchar(input_form.label1.caption)
   
    else       result:=   '   ';
    end;
    //temp   :=   result   ;
    temp   :=   sysallocmem(   result   的长度+1   );
  复制result的内容到temp;
result:=temp;    
end;
发表于:2007-11-05 17:33:379楼 得分:0
to   楼上的你的想法应该是行不通的;
因为input_form.label1.caption中显示的字符是正常的.只是返回到调用程序时才不能正常显示;
发表于:2007-11-05 20:38:2810楼 得分:0
总算找到了,可还是有点不懂
问题在于:没有释放form窗体把涵数改为:
function       ddd(       filename:pchar;field_index:integer):pchar;  
var  
input_form:tinput_code_form;  
begin  
input_form:=tinput_code_form.createform(filename,field_index);  
try
with       input_form       do  
    begin  
    if       showmodal       =       mrok       then       result:=pchar(input_form.label1.caption)  
    else       result:=   '   ';  
    end;
finally
input_form.free;//或是freeandnil(input_form);
end;
end;  

可我还是弄不明白.照我的理解:showmodal=mrok就回释放form为什么还要free呢?
发表于:2007-11-05 20:45:3711楼 得分:5
你知道为啥错误么?
你返回了一个指针,这个指到一个局部变量,函数返回的时候这个局部变量已经无效.你说你返回的这个指针有意义么?
我写的方法就是在堆上分配一段内存,只要不释放一直是有效的

返回string是因为string是一个对象,delphi会保证返回的string对象是有效的.


快速检索

最新资讯
热门点击