我用VC6.0写了一个关于socket传送文件的DLL,在delphi调用这个DLL, 函数原型
void _stdcall SendFileThread(char* szFileName) procedure TFormMain.BtnSendFileClick(Sender: TObject); 
var 
  vStrFileName: String; 
  vFileName: PChar; 
begin 
  if OpenDialog1.Execute then 
  begin 
    vStrFileName := ExtractFileName(OpenDialog1.FileName); 
    //vFileName := AllocMem(100); 
    vFileName := pchar(vStrFileName); 
    SendFileThread(vFileName);              //发送文件(文件名不包含路径) 
  end; 
end; 
1.请教一下,在这种情形下,//vFileName := AllocMem(100);用不用加?不加也不会出错好象 
2.这里的PChar是由谁释放的,啥时候释放的?如果不释放,就算一秒传1个文件名,一天下来系统也受不了吧? 
3.为啥我取文件名的时候,不用带路径啊,不带路径,系统也能正确找到文件,在VC代码中也不用带路径的.  
4.如果这里的pchar释放早了,DLL还会收到参数吗? 我在MFC版也发了此问题,
http://topic.csdn.net/u/20090106/15/2f7ce821-9df6-4df8-ad47-b8f25c7ec5c7.html

解决方案 »

  1.   

    声明的时候调用应该用
    procedure TFormMain.BtnSendFileClick(Sender: TObject); 
    var 
      vStrFileName: String; 
      vFileName: array[0..256] of Char; 
    begin 
      if OpenDialog1.Execute then 
      begin 
        vStrFileName := ExtractFileName(OpenDialog1.FileName); 
        //vFileName := AllocMem(100); 
        SttPCopy(vFileName,vStrFileName); 
        SendFileThread(vFileName);              //发送文件(文件名不包含路径) 
      end; 
    end; 
      

  2.   

    StrPCopy(vFileName,vStrFileName); 
    写错一行
      

  3.   

    如我以上写法,编译通过,运行结果没问题,我的疑问如下,关于释放 这个问题麻烦再看一下, 
    var 
      vStrFileName: String; 
      vFileName: PChar;     //vFileName := AllocMem(100); 
        vFileName := pchar(vStrFileName); 1. 这里的vFileName: PChar; 用不用手工释放?它好像局部量数,我记忆中局部变量不用手工释放,疑问在此啊? 
    1.5 如果不用手工释放,它是何时释放的? 
    2. //vFileName := AllocMem(100); 这句加与不加在释放的时候有何不同???? 
      

  4.   

     vStrFileName := ExtractFileName(OpenDialog1.FileName); 
        //vFileName := AllocMem(100); 这句不能加,因为你是将vStrFileName的地址赋给vFileName的。
        vFileName := pchar(vStrFileName); 
        SendFileThread(vFileName);              //发送文件(文件名不包含路径) 不用手工释放。如果加上则应该这样写。
    procedure TFormMain.BtnSendFileClick(Sender: TObject); 
    var 
      vStrFileName: String; 
      vFileName: pChar; 
    begin 
      if OpenDialog1.Execute then 
      begin 
        vStrFileName := ExtractFileName(OpenDialog1.FileName); 
        vFileName := GetMem(100); 
        StrPCopy(vFileName,vStrFileName); 
        SendFileThread(vFileName);              //发送文件(文件名不包含路径) 
        FreeMem(vFileName);
      end; 
    end; 
      

  5.   

    为什么要用VC6.0写了一个关于socket传送文件的DLL,在delphi调用这个DLL???Delphi本身就可以用纯代码实现文件传送,而且代码不多!
      

  6.   

    这个应该在C++程序当中去处理,DLL接收的参数是一个指针,如果C++当中直接使用该字符串指针的话,那么相应的内存管理必须要考虑,当使用同步模式处理的时候,不会有问题。但是当使用异步模式之后,该函数被调用返回了,相应的字符串内存就有可能被释放或者改写,如果在DLL当中继续使用该指针,那么就可能是一个野指针自然有问题,个人建议是在DLL内部再使用如string等复制一份文件名进行使用。