library dll;
uses
SysUtils,Classes;
{$R *.RES}
function TestDll(const a: string;t:Longint):Longint;stdcall;
begin
if ((a = '')or( t<5)) then Exit;
result:= Sqr(strtoint64(a) - t);
end;
exports
TestDll;
begin
end.
Private Declare Function TestDll Lib "dll.dll" (ByVal a As String, ByVal t As Long) As longPrivate Sub Command1_Click()
Text3 = "34612795304820"'这个值是 5883264*5883264+11124得到的,所以不会出现其他的问题.
msgbox TestDll(Text3.Text, 11124
End Sub
'返回结果要求是 5883264现在还是搞不定,一运算结果就错了,

解决方案 »

  1.   

    Private Declare Function TestDll Lib "dll.dll" (ByVal a As String, ByVal t As Long) As long 
    t定义成Long会溢出 ,定义成Currency不会溢出,这需要修改delphi DLL源码。
      

  2.   

    是msgbox TestDll(Text3.Text, 11124)出错,还是5883264*5883264+11124运算出错? 
    将5883264*5883264改成:5883264^2试一下
      

  3.   

    Private Declare Function TestDll Lib "dll.dll" (ByVal a As String, ByVal t As Long) As long Private Sub Command1_Click() 
    Text3 = "34612795304820"'发送过去.这个值是 5883264*5883264+11124得到的,所以不会出现其他的问题. 
    msgbox TestDll(Text3.Text, 11124)
    End Sub
    这上面发送过去不会有问题.
    但是到了DLL里面运算以后返回的值不是5883264了,
    library dll; 
    uses 
    SysUtils,Classes; 
    {$R *.RES} 
    function TestDll(const a: string;t:Longint):Longint;stdcall; 
    begin 
    if ((a = '')or( t <5)) then Exit; 
    result:= Sqr(strtoint64(a) - t); 
    end; 
    exports 
    TestDll; 
    begin 
    end. 
      

  4.   

    result:= Sqr(strtoint64(a) - t); ------> result:=10000* Sqr((strtoint64(a) - t)/10000);  
     
      

  5.   

    上面错了:
    result:= Sqr(strtoint64(a) - t); ------> result:=100* Sqr((strtoint64(a) - t)/10000);   
      

  6.   

    呵呵result:= Sqr(strtoint64(a) - t); ------> result:=100* Sqr((strtoint64(a) - t)/10000);   修改以后DLL编译都通不过了.
    我还是详细说一下吧,
    Text3 = "34612795304820"'这个值是 5883264*5883264+11124得到的,
    msgbox TestDll(Text3.Text, 11124) 这里到DLL里面去了,.发送过去的text3的值我这里是固定的为了方便. result:= Sqr(strtoint64(a) - t);   这个就反出来结果 上面的算法是+11124 所以在这里就减11124 然后在sqr函数就变成5883264的结果了.为什么用strtoint64()呢,因为发送过来的是string接收也是一样,如果要经过加减运算起码一点就是要把string转成int后才行. 在VB里面很简单,只要int(string)就可以转过来了,但是delphi里不知道什么地方出了错误.,不是结果不对,就是返回付数,要么就是一运算就死了.
      

  7.   

    delphi我不会,我问一下:strtoint64(a)-t这个运算的结果是什么类型?而Sqr()应该是浮点型吧!再说开方也不应该返回负数!而你定义的结果类型是Long,需要转换类型!
      

  8.   

    strtoint64(a)-t 这句是把a:string转成数字,然后在减去11124  sqr是开方 因为我上面"34612795304820"'这个值是 5883264*5883264+11124得到的所以不会出现浮点 得到的都是整数.都知道"34612795304820"这么长的数字在VB里面只能是string传过来,然后到DLL里面接收以后在转换在运算 ,我用com dll写的就是直接用int(a)就可以了,没有任何问题,只是想写个标准的DLL所以用delphi,结果问题多多,哎.
      

  9.   

    你查一下delph资料, strtoint64(a)-t这个运算的结果是不是超过了delph规定的位数
      

  10.   

    Private Declare Function TestDll Lib "dll.dll" (ByVal a As String, ByVal t As Long) As LongPrivate Sub Command1_Click()
    MsgBox TestDll("34612795304820", 11124)
    End Sublibrary dll;
    uses
    SysUtils,Classes;
    {$R *.RES}
    function TestDll(const a: string;t:Longint):Longint;stdcall;
    begin
    if ((a = '')or( t<5)) then Exit;
     result:= strtoint64(a);
    end;
    exports
    TestDll;
    begin
    end.我自己写不运算返回的结果都是付数.
      

  11.   

    很明显:result:= strtoint64(a)错了,result是Long型,不会超过11位
      

  12.   

    那应该改成什么类型呢?也用string 返回?
      

  13.   

    result:= Sqr(strtoint64('34612795304820')- 11124) 得出来的结果 是 5883264 啊,才7位.
    为什么返回去的是负数呢.,
      

  14.   

    library dll;
    uses
    SysUtils,Classes;
    {$R *.RES}
    function TestDll(const a: string;t:Longint):Longint;stdcall;
    begin
    //if ((a = '')or( t<5)) then Exit;
    result:= Sqr(strtoint64('34612795304820')- 11124) ;
    end;
    exports
    TestDll;
    begin
    end.我直接这样写,返回的结果是 268435456.却不是 5883264 只又是什么问题呢,我用计算器计算出来的结果是5883264但程序里面就不对了.