我是delphi初学者,遇到这样一个问题
我是要在delphi中调用用vc++写的dll动态库
在vc++中 .h的声明文件中为:__int16  __stdcall  IC_Read_Float(HANDLE idComDev,__int16 offset,float *fdata); 
但我不知 在delphi声明中用什么数据类型取代 float* ,
我这样试过
...
type
Psingle=^Single.... Function IC_Read_Float(idComDev:longint;offset:smallint;databuffer:Psingle):smallint;stdcall;
 far;external 'Da32.dll' name 'IC_Read';
......var
sdata:psingle; GetMem(sdata,16); 
 st:=IC_Read_Float(icdev,60,sdata);   //位置一编译能成功 但当我运行到位置一时 就出错了 ....error:access violation....
请各为大侠帮帮我

解决方案 »

  1.   

    float *fdata->var fData: Single;
      

  2.   

    跟下面一样就ok了
    function RegDeleteKeyA; external 'advapi32.dll' name 'RegDeleteKeyA';
      

  3.   

    谢谢,但我换成了,var fData: Single 但还是在运行时出错的 ,不知哪位高手在delphi中用过 (相当于vc++中的float *) 数据格式,请赐教,谢谢
      

  4.   

    Delhpid的Single对应vc++的float,*在vc中是指针,delphi中用var对应。所以这样写式正确的。
    肯定是其他问题了,我特意写了个dll,函数和你的dll是一样的,运行时很正常:function IC_Read_Float(idComDev:longint;offset:smallint;var databuffer:Single):smallint;stdcall; far;external 'e:\tmp.dll' name 'IC_Read';procedure TForm1.Button1Click(Sender: TObject);
    var
      tmp: Single;
    begin  IC_Read_Float(1,60,tmp);
      ShowMessage(FloatToStr(tmp));//显示的结果是1000end;VC代码:
    __int16  __stdcall  IC_Read(HANDLE idComDev,__int16 offset,float *fdata); __int16  __stdcall IC_Read(HANDLE idComDev,__int16 offset,float *fdata)
    {
    *fdata=1000;
    return 1;
    }
      

  5.   

    应该是你的dll中既有IC_Read,也有IC_Read_Float,所以运行的时候没有告诉你找不到IC_Read的入口。
    function IC_Read_Float(idComDev:longint;offset:smallint;databuffer:Psingle):smallint;stdcall;
     far;external 'Da32.dll' name 'IC_Read_Float';//你要的在vc中定义的是IC_Read_Float,非IC_Read
      

  6.   

    动态库中不要使用float型,最后仅仅使用int和指针型数据,否则因为不同编译器对于数据类型的处理不同而造成不能兼容处理。
    看看WIN API就会明白
    你可以把float放大至整数作为参数传递