c++写的跨平台dll,函数接口是这样:
STDMETHODIMP CFun::GetMyFileName(BSTR SrcFileName, BSTR *MyFileName)
请问在delphi中如何声明这函数去调用它?

解决方案 »

  1.   

    对方给出的源码函数结构是这样,具体我也不太清楚,对COM跟C++里的东西不熟
      

  2.   

    跟一下不就看到了,这个宏展开后就是 __stdcall#define STDMETHODIMP           HRESULT STDMETHODCALLTYPE
    #define STDMETHODCALLTYPE       __stdcallCFun.GetMyFileName(SrcFileName:PWideChar, BSTR PPWideChar);stdcall;
      

  3.   

    CFun.GetMyFileName(SrcFileName:PWideChar; MyFileName:PPWideChar);stdcall;
    // CFun 不知是名字空间还是类名,自己判断
      

  4.   

    楼上正解,可在Delphi里我这样声明这个接口还是不对:
    procedure GetMyFileName(SrcFileName:PWideChar; MyFileName:PPWideChar); stdcall; external 'ThisTest.dll';
      

  5.   

    CFun.GetMyFileName(SrcFileName:PWideChar; MyFileName:PPWideChar)
        :Integer;stdcall;external 'ThisTest.dll';
      

  6.   

    这样也不行
    function GetMyFileName(SrcFileName:PWideChar; MyFileName:PPWideChar): integer; stdcall; external 'ThisTest.dll';对C++实在陌生得不行
      

  7.   

    导出类方法不是标准的dll导出。我觉得delphi不支持。
      

  8.   

    这个DLL听说可以在不同平台上调用(linux或Win),所以才使用的BSTR类型,尝试了很多种不同的声明接口方法,都没管用
      

  9.   


    type
      TMyFileName = ^WideChar;function GetMyFileName(SrcFileName: PWideChar; var MyFileName: TMyFileName)
      : integer; stdcall; external 'ThisTest.dll';var
      str1: PWideChar;
      str2: TMyFileName;
    begin
      str1 := 'aaaaa.txt';
      GetMyFileName(str1, str2);
      ShowMessage(PWideChar(str2));
    end;
    呃,试试
      

  10.   

    除非dll这个GetMyFileName声明为static静态方法才行,这dll是啥玩意,楼主看看它的文档说明啊,接口咋公开的?
      

  11.   

    他原来给的函数接口说明其实是这样的
    char * GetMyFileName(char * SrcFileName)
    上面的接口我一般是使用下面的声明方法:
    function GetMyFileName(SrcFileName: PChar): PChar; cdecl(或stdcall); external 'ThisTest.dll';
    用这种声明方法,不管是C#写的还是C++写的DLL,只要DLL本身没问题,一般都可以正常使用。但偏偏他的这个DLL我这样声明没法加载,后来写DLL的那人说可能他是Linux下写的,所以才换成STDMETHODIMP CFun::GetMyFileName(BSTR SrcFileName, BSTR *MyFileName),不过换成这种之后试过各种声明方法,还是没法加载
      

  12.   

    CFun如果是类的话就比较麻烦,如果是namespace的话函数也会被重命名.
    你应该用DLL函数查看器,看一下真正的函数名是什么
      

  13.   

    人家是 char * GetMyFileName(char * SrcFileName);
    你弄成 STDMETHODIMP CFun::GetMyFileName(BSTR SrcFileName, BSTR *MyFileName);
    是你乱来嘛,这根本就是另一个函数了
      

  14.   

    sololie兄,他本来是char * GetMyFileName(char * SrcFileName);可这接口没法用之后他才改成
    STDMETHODIMP CFun::GetMyFileName(BSTR SrcFileName, BSTR *MyFileName);
    现在问题也还没解决,只能先放着了