DLL中有一方法TEST.
用于返回SQL的结果,返回类型是OLEVARIANT,使用CLIENTDATASET接收.function TClient.Test:olevariant;
var
  tmp : TClientDataSet;
  sql : string;
begin
  try
    tmp := TClientDataSet.Create(nil);
    sql := 'SELECT TOP 1 JE FROM TABLE';
    tmp.Data := FIEngine.SeleSql(PChar(sql));
    Result := tmp.Data;
    ShowMessage(formatfloat('0.00',tmp.Fields.Fields[2].Value));
  finally
    tmp.free;
  end;
end;如果SQL仅仅是查询某条记录的话.DLL和EXE返回结果一致.
如果执行  SELECT SUM(JE) FROM TABLE,DLL中结果正确.EXE中不正确...
比如DLL中SHOWMESSAGE的结果是11110,EXE中却为10000.
不知道怎么回事了..

解决方案 »

  1.   

    啥意思?
    刚刚又试了一下...
    表中只有1条记录,999999999.12
    结果EXE中显示999990000
      

  2.   

    用 ASFLOAT也一样的.
    试了一下弱智的方法
    SELECT CONVERT(VARCHAR(13),SUM(JE)) FROM TABLE
    这样就好了.....
      

  3.   

    tmp.Fields.Fields[2].Value??
    这个是写错了.....[0]....
      

  4.   

    试一下一个更笨的方法,来小值测试。1 2 等。
    我感觉好像是查询的结果返回的数值已经不一样了。再show可能也就不一样了。
      

  5.   

    2种情况下都sql事件跟踪看看,应该不会错的啊!
      

  6.   

    都试过了..DLL中SHOW是正确的....
    不了解为什么了
    要等牛XXXXX的淫了
      

  7.   

    olevariant 是个不确定类型,也可以说是不确定长度的类型,这种类型不适合作为DLL函数的返回值,实际上也不适合作为函数的返回值(如果按照标准书写规范来说)。函数返回值尽量使用定长数据类型,最好记录结构也不要使用,如果需要返回特殊长度的数据,最好使用 VAR、OUT方式定义的参数。在使用参数返回数据的时候,如果函数在DLL中,应该在调用者(EXE)中开辟足够的缓冲区,并告知被调用者缓冲区长度(使用另外的参数,参考下MS的API定义)。olevariant 这类不定长(实际上可能是无限大)的数据,不适合传递到函数外,建议使用回调函数,或者消息方式传递给调用者。
      

  8.   

    实际上楼主对DLL、函数接口定义很陌生,这个BUG是楼主的书写问题,不属于系统问题。多看看MS的编程规范,多看看操作系统SDK