小弟在DLL里声明了个记录类型如下:type
  Component = Record
    PartNum   : Pchar;
    Ver       : Pchar;
    Des       : Pchar;
    SUPBy     : Pchar;
    FileName  : Pchar;
    Size      : Int64;
    Created   : TDateTime;
    Modified  : TDateTime;
end;用该记录类型作为A函数的返回值给主程序,在主程序里也同样定义了一样的记录类型,可是在调用DLL里的A函数后,发现PartNum的值不对,后面出现乱码,我想应该是内存读写问题,但不知道该如何处理,请高手赐教!PS: A函数是用stdcall.

解决方案 »

  1.   

    1、内存问题,注意谁负责GETMEM
    2、调用协定不一致,两边都是stdcall?有没漏写?
      

  2.   

    加了 shareMem 没有?pchar 内存在调用端申请的还是DLL里申请的?
      

  3.   

    看这个记录里好像没有什么特别的类型
    建议直接返回一个json字符
      

  4.   

    谢谢那么快回复。
    1。没有调用GETMEN,直接赋值的。
    2。调用协定都一直的,没有错。
      

  5.   

    代码不多的话 贴出来吧
    DLL 和调用部分的都贴出来
      

  6.   


    PChar  是个指针, 你得分配内存.
      

  7.   


    那如果在DLL里用StrAlloc分配内存的话,在哪里释放呢?主程序吗?
      

  8.   

    給字元指標(PChar、PWideChar、PAiChar)分配記憶體, 最佳選擇是: StrAlloc.
      StrAlloc 雖然最終也是調用了 GetMem, 但 StrAlloc 會在指標前面添加 Delphi 需要的 4 個管理位元組(記錄長度).
      StrAlloc 分配的記憶體, 用 StrDiose 釋放, 用 StrBufSize 獲取大小.
      用 FreeMem 釋放可以嗎? 這樣會少釋放 4 個位元組.
      這種類型的指標一般用於 API 函數的參數, 譬如獲取窗口標題:var
     p: PChar;
    begin
     p := StrAlloc(256);
     GetWindowText(Handle, p, StrBufSize(p));
     ShowMeage(p); {Form1}
     StrDiose(p);
    end;  StrAlloc 根據不同的參數(PWideChar、PAiChar)分別重載調用了 WideStrAlloc、AiStrAlloc, 所以我們也可以直接使用這兩個函數(這也需要用 StrDiose 釋放), 不過使用它們的必要性不大; 用 StrAlloc 指定好參數類型即可.
      給字元指標分配記憶體其他方法也挺方便, 譬如://獲取 WINDOWS 所在目錄
    var
     buf: array[0..MAX_PATH] of Char;
    begin
     GetWindowsDirectory(buf, Length(buf));
     ShowMeage(buf); {C:WINDOWS}
      

  9.   

    直接用 TStream (TMemoryStream)作为参数传递更好。
      

  10.   

    如果串不长,把pchar都换成 string[n] 吧