在vc中定义的函数原型:Frequency1(int BlockLength,FILE* fp);
delphi中function Frequency1(BlockLength:integer;fp:pfile ):double ;far;external'symmetry_modules.dll' ;调用assignfile(f,'E:\test\crytext');
 tt:=@f;
 cc:= Frequency1(xx,tt);
其中文件是二进制文件。
为什么总是说NTDLL.DLL出错呢?谁帮我解决这个问题,我再加100分
是不是DELPHI与VC的文件类型什么不一致。

解决方案 »

  1.   

    你用VC编译的DLL一定是cdecall和stdcall类型,而且两边的调用一定一致。
    你采用的是静态调用,你可以跟综测试哈!
    当然你要确包是那边出的问题哈,采用动态调用可以监控指针哈!好调释哈
      

  2.   

    那个dll不是我写的。而且对vc不是很熟。别人只是给我提供了一个这样的接口,让我用而已。会不会是因为delphi vc中文件的定义不一致所造成的。help me!
      

  3.   

    你的DLL中调用了你现有系统不支持的API函数。
      

  4.   

    这是vc中函数的原型,没有用到什么特别的api阿float Followancy1(int BlockLength,FILE* fp)
    {   int freqnum;   
        int TestLength=0,testnum,testnum1,testlen=0;
    int  *BlockData ;
    char *TestData;
    int  i,readnum;
    float result;
        BlockData=(int *)malloc((BlockLength+1)*sizeof(int));
        TestData=(char *)malloc(BlockLength/8);
    for (i=0;i<=BlockLength;i++)
           BlockData[i]=0;  
        do 
     {
      readnum=fread(TestData,sizeof(char),BlockLength/8,fp);
      if (!readnum)  break;
          TestLength++;
      freqnum=0;
          for (i=0;i<readnum;i++)
      {if (i>0) 
         {testnum=TestData[i];
          testnum&=128;
      if (testnum) TestData[i-1]^=1;}
      
       testnum=testnum1=TestData[i];
       testnum1=testnum1<<1;
           testnum=testnum^testnum1;
       TestData[i]=(char)testnum;    /*for (j=1;j<9;j++)
       {
    testnum1=testnum&128;
            if  (testnum1)  freqnum++;
    testnum=testnum<<1;
       }*/
      }
      TestData[readnum-1]&=254;
      //BlockData[freqnum]++;
          BlockData[HammingWeight(readnum,TestData)]++;
    }
    while  (!feof(fp));   
    result=two_test2(BlockLength-1,TestLength,BlockData);
    //return (two_test2(BlockLength-1,TestLength,BlockData));//?????

        free(BlockData);
    free(TestData);    return(result); 
    }
      

  5.   

    那个dll不是我写的。而且对vc不是很熟。别人只是给我提供了一个这样的接口,让我用而已。会不会是因为delphi vc中文件的定义不一致所造成的。
    我以前也做过类似的,确实是因为定义不一致导致的,就是那个File *Fp
    和delphi中不一致,你将这个参数换掉,换成将文件名传过去
    在C中
    用Char *a;
    Delphi用 var a: PChar就好了
    我就是这样做的
      

  6.   

    HammingWeight和two_test2这两个函数呢?我给你测试一下!
      

  7.   

    没有别的办法了吗?修改那各dll文件可能需要很多的精力!!!
      

  8.   

    int HammingWeight(int ByteNum,char* Block)
    { int  i,j,testnum,testnum1,freqnum;
      char *BlockPtr;
      freqnum=0;
      BlockPtr=Block;   
      for (i=1;i<=ByteNum;i++)
     {testnum=*BlockPtr;
       for (j=1;j<9;j++)
       {
    testnum1=testnum&128;
            if  (testnum1)  freqnum++;
    testnum=testnum<<1;
       }
       BlockPtr++;
      }
        return(freqnum);
    }
    float  two_test2(int BlockLength,int Length,int*Data)
    {   double midsum=0,temp=0,temp1=0,assumnum=0,assumnum1=0,tempdata=0,tempdata1=0;
        int    blocktemp=0,blocktemp1=0,i=0;
       
    int    trueblock=0;
    /*The following is to compute the verified value!*/  
        for (i=0;i<=BlockLength;i++)
    {    

    temp=Length*Pi(BlockLength,i);
         
         tempdata+=temp;
     blocktemp+=Data[i];
     if (tempdata>5)   
     {temp1=(blocktemp-tempdata)*(blocktemp-tempdata);   
      assumnum1=temp1/tempdata;
      assumnum=assumnum1+assumnum;   
      blocktemp1=blocktemp;
      tempdata1=tempdata;
      trueblock++;
      tempdata=0;
      blocktemp=0;}

    if (tempdata) 
    {blocktemp+=blocktemp1;
     tempdata+=tempdata1;
     assumnum-=assumnum1;
     temp1=(blocktemp-tempdata)*(blocktemp-tempdata);
         assumnum=temp1/tempdata+assumnum;
        }  return((float)(assumnum));}
      

  9.   

    FILE *fp 应该是 stdio.h 的标准文件操作函数制止,应该是一样的如果不行的话,将 FILE *fp 改为传递要打开的文件名进去
    那样的话,改动也是很少的
    float Followancy1(int BlockLength,PChar *lpfilename)
    {
      FILE *fp = fopen ( lpfilename, "rb" );
      .......
    }不过最好还是不要传递 FILE * 文件指针,使用我说的方法安全很多
      

  10.   

    写错了
    float Followancy1(int BlockLength,PChar lpfilename)你的调用有错,因为 DLL 要求的是文件读写的指针,你提供的是文件名
    (不错才怪呢)
      

  11.   

    看错了
    如果 Delphi 没有 DOS 下的直接读写文件的函数
    fopen、fwrite、fread、fclose 等的话
    (比 open、read、write、close 等多了一个字母 f )在 TC2.0、BC++ 3.1 for DOS 下使用的
    (不知道在 Turbo Pascal 下如何使用?我没有使用过 Delphi,正在学习)只能通过传递要操作的文件名进去了
      

  12.   

    看错了
    如果 Delphi 没有 DOS 下的直接读写文件的函数
    fopen、fwrite、fread、fclose 等的话
    (比 open、read、write、close 等多了一个字母 f )在 TC2.0、BC++ 3.1 for DOS 下使用的
    (不知道在 Turbo Pascal 下如何使用?我没有使用过 Delphi,正在学习)只能通过传递要操作的文件名进去了
      

  13.   

    晕two_test2函数里还有pi这个函数,我编译不过啊
      

  14.   

    你在Delphi里调用的函数
    function Frequency1(BlockLength:integer;fp:pointer ):double ;far;
    external'symmetry_modules.dll' ;
    试试
      

  15.   

    这样试试
    function Frequency1(BlockLength:integer;fp:pchar):double ;stdcall;
    external'symmetry_modules.dll' ;
      

  16.   

    错误是:
    一运行就说access violation  at address XXXX in module 'ntdll.dll'
    我已经快绝望了。是在不行就得去改底层接口了。
    那个pi 函数
    double Pi(int n,int m)
    {double PiValue;
     int i;
     int m1;
     m1=m;
     PiValue=1.0;
     for (i=1;i<=n;i++)
       PiValue/=2;
     if (m&&m!=n)
     {if (m>n-m) m1=n-m;
      for (i=1;i<=m1;i++)
     PiValue*=(n-i+1);  
     for (i=1;i<=m1;i++)
     PiValue/=i;
     }
     return PiValue;
    }
    辛苦你了,菜鸟
      

  17.   

    唉,我也搞不定啊。
    提供点资料吧:
    在Delphi中,文件指针可用pchar型
    function Frequency(BlockLength:integer;fp:pchar):double ;stdcall;
    external 'symmetry_modules.dll' ;
    za再看看:
    http://www.china-askpro.com/msg25/qa54.shtml