问题:一个函数
Type TMyDLLFunc=function():wideString;stdcall;Function func1:boolean;
var
  H_inst:THandle;
  MyFPointer:Pointer;
  MyFunc:TMyDLLFunc;
begin
  H_inst:=LoadLibrary('mydll.dll');
  if H_inst=0 then
  begin
      showmessage('加载动态库失败!');
      Result:=false;
  end
  else if H_inst>0 then
  begin
   try
     MyFPointer:=GetProcAddress(H_inst,pchar('mydllfunc'));
     if MyFPointer<>nil then
     begin
       MyFunc:=TMyDLLFunc(MyFPointer);
       if MyFunc<>'' then
       begin
         showmessage(myfunc);
         Result:=False;
       end
       else Result:=True;        
     end;
   finally
     FreeLibrary(H_inst);
   end;                 
  end;
end;
在窗体中调用的时候:
procedure TForm1.FormCreate(Sender: TObject);
begin
  if func1 then showmessage('ok');
  otherfucn;//这里是其它的过程或函数,在这里出现了 Access violation错误,我怀疑是由于func1里指针导致的,可是找不到原因,求解
  
end;

解决方案 »

  1.   

    delphi返回的不能是string,而应该是char*类型,就是pchar,这样其它语言才能用
      

  2.   

    楼上的什么意思啊?详细说说啊?dll返回的不能是String??
      

  3.   

    在dll工程,最开始uses处引用ShareMem,试试看.这个就可以用string
      

  4.   

    返回string要在DLL和EXE都加ShareMem.
      

  5.   

    Type TMyDLLFunc=function():wideString;stdcall;Type TMyDLLFunc=function(buf: Pchar):Boolean;stdcall;外部去申请内存,用完外部在释放掉
      

  6.   

    pchar 类型 用FreeMem() 释放~
      

  7.   

    FreeMem(MyFPointer)//这样是不行的,错误依然
      

  8.   

    一帮人瞎指挥,WideString根本就不是Delphi RTL进行内存分配管理的,而是com的标准类型。如果单纯只有这一个函数的话,WideString根本什么都不影响,ShareMem根本就管不着它。
    如果两个函数声明的确都是 function():wideString;stdcall; 而且这个函数本身没问题的话,那错误就不是由它引发的
      

  9.   

    顶楼上的,说的正和我意,我也奇怪,widestring和string当然不一样,从外观上看都不一样的嘛,我感觉还是函数指针的问题,求解中~
      

  10.   

    Delphi做的Dll中的函数,返回值类型最好不要用String等Delphi自定义的类型,因为可能导致在其他语言中调用这个Dll时,可能导致数据类型转换的错误。这个在Delphi新建一个空的Dll工程时,会有一大段注释解释原因的。可以按dd_zhouqian说的那样,用PChar代替String,用于参数和返回值中。
    Type TMyDLLFunc=function(var buf: Pchar):Byte;stdcall;
    外部去申请内存,用完外部在释放掉。这样的内存在你调用的地方使用GetMem动态分配,将动态分配的PChar变量传给调用你的Dll函数,Dll函数会操作Pchar变量,得到你要的结果,用完后,你对该变量进行你需要的处理,处理完后,FreeMem掉分配的内存。(要长久的持有这个结果,你可以在FreeMem前的处理过程中,将PChar存储的内容取出来放到一个可以长久持有的变量中,eg Delphi的String类型变量中)。
    可以参考:http://www.delphibbs.com/keylife/iblog_show.asp?xid=26977
      

  11.   

    Assigned 是用来判断某一指针(pointer)或过程引用是否为nil(空),如果为空则返回假(false)。用这个函数来调试吧。
      

  12.   

    MyFunc:TMyDLLFunc;MyFunc:=TMyDLLFunc(MyFPointer);MyFunc是函数的返回值,应为widestring试试这样写
    MyFPointer: TMyDLLFunc;
    MyFunc: WideString;  MyFPointer := TMyDLLFunc(GetProcAddress(H_inst,pchar('mydllfunc')));
      if MyFPointer<>nil then
      begin
      MyFunc := MyFPointer();
      if MyFunc<>'' then