dll文件中的函数是://*************取得硬盘序列号*****************
function Get_DiskSerialNo(DriveID : char) : string; stdcall;
var
  VolumeSerialNumber : DWORD;
  MaximumComponentLength : DWORD;
  FileSystemFlags : DWORD;
begin
  result := '';
  try
    GetVolumeInformation(PChar(DriveID + ':\'),nil, 0, @VolumeSerialNumber,
        MaximumComponentLength, FileSystemFlags,nil, 0);
    result := IntToHex(HiWord(VolumeSerialNumber), 4) + '-'
          + IntToHex(LoWord(VolumeSerialNumber), 4);
  except
    ShowMessage('系统出错,内存溢出!');
  end;
end;在调用时会出现;"invalid pointer Operation"

解决方案 »

  1.   

    这些函数不在dll,直接在当前程序中都是没有问题的
      

  2.   

    我是通过静态调用的    function Get_DiskSerialNo(DriveID : char) : string; far stdcall;
           external 'PunUnitLib.dll' name 'Get_DiskSerialNo';  //得到硬盘卷标号
        function Encrypt(s: string; key: word): string; far stdcall;
           external 'PunUnitLib.dll' name 'Encrypt';
        function Decrypt(s: string; key: word): string; far stdcall;
           external 'PunUnitLib.dll' name 'Decrypt';这样的
      

  3.   

    好象是这句有问题PChar(DriveID + ':\')
    var
      temp:Pchar;
    begin
      temp:=StrCat(DriveID+':\');
    end;
    试试这个,另外最好用MessageBox
      

  4.   

    这个算法读取的序列号不是唯一的,如果重新格式化之后,序列号就改变了!
    我有真正的读取出场序列号的程序,要得话给我邮件[email protected]
      

  5.   

    同样的函数在当前程序不出错,通过dll调用就出错错误提示;
        invalid pointer operation!有没有高手会的
      

  6.   

    我以前也愚到过这种问题,解决方法在这里:
    再函数中所有出现的string类型,全部替换为PChar类型,
      

  7.   

    里面的string 也要换吗?
    还有我用 Uses shareMem 时,应有这样的提示的
      

  8.   

    只要返回的用PCHAR型替换就可以了
      

  9.   

    错误的原因是string与Pchar的转化问题
      

  10.   

    你在Dll中定义的函数返回值应该用PChar类型
    function Get_DiskSerialNo(DriveID : char) : PChar; stdcall;
    因为Delphi中的字符串和C/C++(Dll中用此中方式)中的表示方式不一样
    Delphi字符串第一个字节意思是整个串的长度,后面才是串的内容,
    而C++中从前面开始就是串的内容,最后一字节是标识符‘\0’
    所以如在Delphi中的Dll定义为String,在外部调用时要出错
      

  11.   

    应该是string和pchar的问题