你这个是C++语法耶,改成Delphi应该是 
function Crypt_Get_Version(version :PChar) :integer;
只要在Dll的输出段中声明这个函数的原型就可以了

解决方案 »

  1.   

    在Dll的输出段中声明??
    你不是说要在dll文件里面添加声明吧?我没法修改dll文件啊,没给我源码。
    是在主程序里的implementation字段添加function Crypt_Get_Version(version :PChar) :integer;吗?这不是叫做创建时声明吗?后面还要加上external吗?我用LoadLibrary和GetProcAddress的运行时调用也要加上这种声明?
      

  2.   

    试了,是这样吗?
    implementation
    function Crypt_Get_Version(version:PChar):integer;stdcall;
    external'ca.dll';
    {$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var
       HInst:THandle;
       FPointer:TFarProc;
       MyFunct:TIntFunction;
    begin
       HInst:=LoadLibrary('ca.dll');
       if HInst>0 then
          try
             FPointer:=GetProcAddress(HInst,PChar('Crypt_Get_Version'));
             if FPointer<>nil then
               begin
                 //MyFunct:=TIntFunction(FPointer);
                 Label1.Caption:=version;
               end
             else
               Label1.Caption:='DLL loaded';
          finally
             FreeLibrary(HInst);
          end;
    end;显示出来的还是“version.dll”啊,要怎样取用这个version呢?
      

  3.   

    type
      TDllfunction = function Crypt_Get_Version(version :PChar) :integer;stdcall;
    注意加stdcall或cdecl之类,与动态库里面的定义一致
    实在不行就一个个试form1里面定义一个私有的函数:
    Dllfunction :TDllfunction;formcreate里面 
    DllHandle := LoadLibrary('ca.dll');
    @Dllfunction :=GetProcAddress(DllHandle, 'Crypt_Get_Version');
    调用dll
    buffer :pchar ;
    buffer:=PChar(AllocMem(256));
    Dllfunction(buffer) ;
      

  4.   

    唉,真不好意思!现在我的问题是不懂指针的用法。按照 Linux2001 的示例修改函数说明后,比如这句: Function Crypt_Get_Version(version :PChar) :integer; 参数version原先的C声明是带*的,就是指针的意思吗?我一直对指针比较糊涂的说。现在我在implementation字段里声明了这个函数,然后在主程序里想取得版本号,我该给Crypt_Get_Version什么参数呢?也就是在Crypt_Get_Version()的括号里该填什么呢?这个dll里面一共有48个函数,差不多每个函数的参数都有形如“ int *DerPubkeyLen ”的,是不是凡是带*的一律改写成P什么什么?
    我尝试调用了其他不需要参数的函数,没有问题,只是不懂参数的调用了。
      

  5.   

    nebulaly 兄的如下几句:
    buffer :pchar ;
    buffer:=PChar(AllocMem(256));
    Dllfunction(buffer) ;
    是干什么的呢?
      

  6.   

    然后调用动态库函数,把指针送进去
    Dllfunction已经指向Crypt_Get_Version了
      

  7.   

    可是我把Label1.Caption:=IntToStr(DllFunction(buffer))得到的是“0”??我看了AllocMem的帮助,这个函数会把分配的内存清零,有关系吗?按照说明文件应该是2.0啊,对了Crypt_Get_Version的返回值是integer,不会有小数吧,应该是2对不对?
      

  8.   

    谁能留个Email,我把这个dll连同函数说明发给他,一共600多k,帮我写个示例吧,就是C++改Object Pascal的函数声明、典型的调用语法、包括正确结果。这是我的毕业设计题目,可是一个多星期了我连dll都搞不定,眼看越拖越久,我本来是很有信心的,可是一开始实验室要我用VC,我极不情愿的学了几天什么也没学进去,然后发给我了一个dll说要用的东西都封进dll里了,拿什么工具调用都行,我才重新用了delphi,因为我是从dos的pascal学起的,有感情了。可是这个可恨的dll……到底怎么搞定它啊,我快咬牙切齿了…………
      

  9.   

    返回的integer只是用来判断调用是否成功
    版本号是作为字符串传回来的,自己努力把
      

  10.   

    昏!!!
    原来我一直把函数返回的integer当作了要用的数据,我刚刚澄清了一点:函数返回值是标志该函数状态的,如0表示函数调用成功,而函数所声明的参数有的要赋值做输入,有的只要给它个变量等函数进行操作后当作输出,就像这里的version,我一直的疑惑就是以为这个version要先赋值等于某个东西,然后传给Crypt_Get_Version()函数,然后函数的返回值应该等于“2.0”。现在我用
    Dllfunction(buffer);
    label1.Caption:=buffer;
    终于可以显示“2.0”啦,耶!!!
    呵呵真是一语惊醒梦中人啊,谢谢nebulaly(竹风论坛)兄指点!50分送上!
      

  11.   

    忘了,本来设的分数是20,那就委屈nebulaly兄了,呵呵。
      

  12.   

    不好意思还忘记了 Linux2001 了,唉,现在每天颠倒黑白的过活人都快变异了,呵呵。
    对了还有个遗留问题:对于原先C++声明的Char *version,应该改作version :PChar,要是unsigned char  *version呢?是不是还写version :PChar?那么对于 Int *version又应该改作什么呢?