在C中定义方法 
int WINAPI iTmcReceive( int id, char* buff, int blen, int* rlen ); 实现代码 
char recieveBuffer[D_RECIEVE_BUFFER_SIZE]; 
status = iTmcReceive( m_deviceId, recieveBuffer, D_RECIEVE_BUFFER_SIZE, &recieveLength ); 我转换成delphi,这样定义的 
function  iTmcReceive(id:Integer; buff:PChar;blen:Integer;var rlen:Integer):Integer;stdcall;external 'iTMCTL.dll'; 调用代码 
const D_RECIEVE_BUFFER_SIZE = 1000; 
var 
  status      :Integer; 
  messages    :PChar; 
  recieveLength:Integer; // recieveBuffer:string; 
// aaaaa        :PChar; 
// recieveBuffer:string; 
  recieveBuffer: array [0..D_RECIEVE_BUFFER_SIZE] of Char; 
  status:= iTmcReceive(m_deviceId,recieveBuffer,D_RECIEVE_BUFFER_SIZE,recieveLength); 
无论怎么,recieveBuffer都返回不了结果值呀。 后面的 rlen 写法是正确的,因为我在其它调用函数的地方都是这样写的,都可以用。 

解决方案 »

  1.   

    iTmcReceive(m_deviceId,@recieveBuffer,D_RECIEVE_BUFFER_SIZE,recieveLength);  加一个 @, delphi 这里跟 c 不一样
      

  2.   

    char recieveBuffer[1000];
    >>
    var
    recieveBuffer: array [0..999] of Char; 
      

  3.   

    按comanche 和hongqi162 两位的方法,都试了,都还是不行。
      

  4.   

    你得确认你的dll这样使用肯定是有返回值的
      

  5.   

    返回的recieveLength 值对么?
      

  6.   

    1、dll这样调用,确定是有返回值的。因为,同样的代码,同样的参数值,在VC中是顺利可以取回返回值的。recieveLength 值为0 /* 接收返回值 */
    int recieveLength = 0;
    const int D_RECIEVE_BUFFER_SIZE = 1000;
    char recieveBuffer[D_RECIEVE_BUFFER_SIZE];
    status = iTmcReceive( m_deviceId, recieveBuffer, D_RECIEVE_BUFFER_SIZE, &recieveLength );
    if ( status != D_TMCTLDLL_RESULT_OK ) {
    displayError( status, message );
    return false;
    }
      recieveLength:=0;
     SetLength(str1,1000);
     //D_RECIEVE_BUFFER_SIZE:=1000;
      status:= iTmcReceive(m_deviceId,@recieveBuffer,1000,recieveLength);
      SetLength(str1,Length(str1));
      if status <> D_TMCTLDLL_RESULT_OK then
      begin
        displayError(status,messages);
        Result:=False;
        Exit;
      end;
      

  7.   

    在正常情况下,recieveLength 的返回值应该为9这个值,是我在VC中调试出来的
      

  8.   

    function  iTmcReceive(id:Integer; buff:PChar;blen:Integer;var rlen:Integer):Integer;stdcall;external 'iTMCTL.dll'; 
    rlen:Integer->rlen:pinteger
      

  9.   

    yuqianyi1974 
    定义成 pinteger ,也还是不行
      

  10.   

    function  iTmcReceive(id:Integer; buff:PChar;blen:Integer;var rlen:Integer):Integer;stdcall;external 'iTMCTL.dll'; 
     buff:PChar->var buff:PChar
      

  11.   


    不是问你VC中返回多少,上面你调用的代码返回,recieveLength是多少?正确么?
      

  12.   

    unsigned char      -》 byte 
    unsigned long      -》 DWORD ,或者 longword 
    unsigned long  *   -》 PDWord 
    unsigned char  *   -》 PByte 
    BOOL               -》 Boolean 
    unsinged short *   -》 PByte 
    unsinged short     -》 byte
    char           *   -》 pchar
    char               -》 char
      

  13.   

    LZ的函数说明与C函数说明是对应的,应该没有问题,调用方式也没有问题(recieveBuffer前千万不要加@)。怀疑调用时m_deviceId没有赋予正确的值。
      

  14.   

    BOOL              -》 (*Boolean*) LongBool 
    unsinged short *  -》 /*PByte*/ PWORD
    unsinged short    -》 /*byte*/ WORD
      

  15.   

    建议楼主在DLL方法中加入一个Messagebox方法,然后再在delphi中调用,看看能不能看到messagebox消息,以确保调用到了该方法