我有一个delphi编译出来的dll文件(DDSReader.dll),并且有它的声明头文件,具体内容如下:unit uDDSReader;interfaceuses
  Windows;type
  PPByte = ^PByte;const
  ReaderDllName = 'DDSReader.DLL';const
  ERR_UNKNOW_ERROR      =  0;
  ERR_NO_IMPLEMENTATION = -1;
  ERR_NOT_INIT          = -2;
  ERR_ALREADY_INITED    = -3;
  ERR_INVALID_PORT      = -4;
  ERR_INVALID_BAUDRATE  = -5;
  ERR_INVALID_PARAM     = -6;
  ERR_CONFIG_PORT       = -7;
  ERR_CONFIG_READER     = -8;
  ERR_NO_READER         = -9;
  ERR_NO_CARD           = -10;
  ERR_READ_DETAIL       = -11;
  ERR_COMMUNICATION     = -12;
  ERR_NOT_SPEC_CARD     = -13;
  ERR_ERROR_CHECKSUM    = -14;
  ERR_AUTHORKEY         = -15;
  ERR_WRITE_DETAIL      = -16;function ErrCodeToStr(code: Integer): string;function InitReader(DevPort, BaudRate: Integer; RWTimeOut: DWORD=100): Integer;
stdcall; external ReaderDllName;function CloseReader: Integer; stdcall; external ReaderDllName;function LoadKey(Sector: Byte; PSW: Pointer): Integer;
stdcall; external ReaderDllName;function CheckPassword(Sector: Byte; PSW: Pointer): Integer; stdcall;
external ReaderDllName;function CheckPassword2(Sector: Byte): Integer; stdcall;
external ReaderDllName;function RequestCard(var CardNo: DWORD): Integer; stdcall;
external ReaderDllName;function ReadCard(Block: Byte; data: Pointer): Integer; stdcall;
external ReaderDllName;function WriteCard(Block: Byte; data: Pointer): Integer; stdcall;
external ReaderDllName;
function ChangePassword(Sector: Byte; PSW: Pointer): Integer; stdcall;
external ReaderDllName;implementationfunction ErrCodeToStr(code: Integer): string;
begin
  case Code of
  ERR_UNKNOW_ERROR:      Result := '未知错误';
  ERR_NO_IMPLEMENTATION: Result := '功能未实现';
  ERR_NOT_INIT:          Result := '模块未初始化';
  ERR_ALREADY_INITED:    Result := '模块重复初始化';
  ERR_INVALID_PORT:      Result := '端口不存在或已经被占用';
  ERR_INVALID_BAUDRATE:  Result := '无效通讯速率';
  ERR_INVALID_PARAM:     Result := '无效参数';
  ERR_CONFIG_PORT:       Result := '配置端口出错';
  ERR_CONFIG_READER:     Result := '配置出错';
  ERR_NO_READER:         Result := '未检测到设备';
  ERR_NO_CARD:           Result := '没有设置';
  ERR_READ_DETAIL:       Result := '读取数据出错';
  ERR_COMMUNICATION:     Result := '通讯错误';
  ERR_NOT_SPEC_CARD:     Result := '不是指定的设置';
  ERR_ERROR_CHECKSUM:    Result := '未初始化';//'数据块校验和错误';
  ERR_AUTHORKEY:         Result := '密码验证错误';
  ERR_WRITE_DETAIL:      Result := '写数据错误';
  else
    if Code > 0 then
      Result := '命令执行成功' else
      Result := '未定义的错误代码';
  end;
end;end.小弟没有学过delphi,请教我要怎么改成C++形式的声明,然后再程序中调用?谢谢大家!

解决方案 »

  1.   

    有把Dll生成lib的软件, 网上有下载,自己搜搜
      

  2.   

    delphi 写的dll有问题,不是标准DLL,无法通用.
      

  3.   


    function ErrCodeToStr(code: Integer): string;
    标准接口中没有string这个类型.所以这个dll只能被delphi使用
      

  4.   

    这不是LIB或dll的问题!
    虽然我不懂delphi,但我想string对应在VC中就是CString类型,ErrCodeToStr(code: Integer): string这个函数我已经改写为VC的形式了,并没有任何问题!我已经可以在程序中用LoadLibrary取函数地址后可以调用了。
    只是在调用RequestCard(var CardNo: DWORD): integer时,会出现无效的访问地址,而调用InitReader(DevPort, BaudRate: Integer; RWTimeOut: DWORD=100): Integer和CloseReader: Integer都没有问题,不清楚var CardNo: DWORD是不是对应VC中的DWORD CardNo?
    期待有更好的解决方法。
      

  5.   

    delphi的string不是vc的CString
    你这么做一定出问题-------------------------------------------------------
    广告:VC/WinAPI 网络/多线程讨论 QQ群, 群号:41356711
      

  6.   

    虽然我不懂delphi,但我想string对应在VC中就是CString类型,ErrCodeToStr(code: Integer): string这个函数我已经改写为VC的形式了,并没有任何问题!我记得string是delphi的内置类型,这个内置类型最初4个字节是字符串长度,之后才是字符串内容,
    而VC的CString是class.你觉得会等价么?
      

  7.   

    这样不是要讨论delphi的string和VC的CString有什么不同,因为ErrCodeToStr函数只是简单地根据错误值返回一个字符串说明错误原因,自己简单地改写一下就可以了,请不要再讨论这个问题,它没有任何意义!  我所关心的是,其它的函数怎么调用!引用前面的一句话:“我已经可以在程序中用LoadLibrary取函数地址后可以调用了。只是在调用RequestCard(var CardNo: DWORD): integer时,会出现无效的访问地址,而调用InitReader(DevPort, BaudRate: Integer; RWTimeOut: DWORD=100): Integer和CloseReader: Integer都没有问题,不清楚var CardNo: DWORD是不是对应VC中的DWORD CardNo?期待有更好的解决方法。”  希望哪位大哥能够指点一二,小弟不胜感激!
      

  8.   

    因为不是标准的DLL 所以出现莫名其妙的问题很正常.你可以用delphi做一次包装写一个dll导出一个标准的dll然后再用VC调用
      

  9.   

    这里不是要讨论delphi的string和VC的CString有什么不同,ErrCodeToStr函数只是根据错误值返回一个错误说明的字符串,简单地改写一下就可以了,请不要再讨论这个问题,它没有任何其它意义!  我所希望的是,怎样才能正确调用dll里面的其它函数,引用前面的一句话:“我已经可以在程序中用LoadLibrary取函数地址后可以调用了。只是在调用RequestCard(var CardNo: DWORD): integer时,会出现无效的访问地址,而调用InitReader(DevPort, BaudRate: Integer; RWTimeOut: DWORD=100): Integer和CloseReader: Integer都没有问题,不清楚var CardNo: DWORD是不是对应VC中的DWORD CardNo?期待有更好的解决方法。”  期待有更好的解决方法,小弟在此不胜感激,谢谢!
      

  10.   

    这个dll是别人开发出来的,如果可以改的话,我早就希望能改个lib出来调用还更简单,那用得着这么麻烦!
      

  11.   

    VC中的CString就可对应Delphi中的string
      

  12.   

    你可以用delphi来再写一个dll工程,在这个工程里面调用原来那个dll里面的函数,并对外公开C语言可用的接口。
      

  13.   

    我要是懂delphi就不用来这里问大家了。
      

  14.   

    要解决这个问题,必须找一个既懂Delphi有熟悉Win32 DLL的人。
      

  15.   

    要解决这个问题,必须找一个既懂Delphi有熟悉Win32 DLL的人。
    =============================================
    正好两个我都懂,但我说的他总认为是多余的
    delphi 写的dll有问题,不是标准DLL,无法通用.只能用delphi再次封装.
    我做过类似的东西,所以才这么说,哎 可惜啊
      

  16.   

    不是我认为多余,而是:  第一,我不懂delphi;
      第二,这个dll库是人家给的,不可能把这个dll库的delphi源代码给我  我根本无法用delphi再次封装,你说我能怎么办?
      

  17.   

    你不再次封装就无法正常调用
    你可以看看windows核心编程中的DLL部分.讲述很很清楚.那种DLL通用.