H264_DVR_API long CALL_METHOD H264_DVR_Login(char *sDVRIP, unsigned short wDVRPort, char *sUserName, char *sPassword,LPH264_DVR_DEVICEINFO lpDeviceInfo, int *error,SocketStyle socketTyle=TCPSOCKET);
VC
typedef struct _H264_DVR_DEVICEINFO
{
char sSoftWareVersion[64];
char sHardWareVersion[64]; ///< 硬件版本信息
char sEncryptVersion[64]; ///< 加密版本信息
SDK_SYSTEM_TIME tmBuildTime;///< 软件创建时间
char sSerialNumber[64]; ///< 设备序列号
int byChanNum; ///< 视频输入通道数
int iVideoOutChannel; ///< 视频输出通道数
int byAlarmInPortNum; ///< 报警输入通道数
int byAlarmOutPortNum; ///< 报警输出通道数
int iTalkInChannel; ///< 对讲输入通道数
int iTalkOutChannel; ///< 对讲输出通道数
int iExtraChannel; ///< 扩展通道数
int iAudioInChannel; ///< 音频输入通道数
int iCombineSwitch; ///< 组合编码通道分割模式是否支持切换
int iDigChannel; ///<数字通道数
unsigned int uiDeviceRunTime; ///<系统运行时间
SDK_DeviceType deviceTye; ///设备类型
char sHardWare[64]; ///<设备型号
}H264_DVR_DEVICEINFO,*LPH264_DVR_DEVICEINFO;//*** */向设备注册
enum SocketStyle
{
TCPSOCKET=0,
UDPSOCKET,
SOCKETNR
};delphi 
function H264_DVR_Login(sDVRIP:pchar;wDVRPort:Word;sUserName,sPassword:pchar;    var LPH264_DVR_DEVICEINFO:_H264_DVR_DEVICEINFO;iError:PInteger;Style:PSmallInt)
:LongInt;stdcall;external  报Access Violation at address 6F6E6B6E Read of address 6F6E6B6E 错误

解决方案 »

  1.   

    stdcall 改成 cdecl 试试
      

  2.   

    H264_DVR_API long CALL_METHOD H264_DVR_Login(char *sDVRIP, unsigned short wDVRPort, char *sUserName, char *sPassword,
       LPH264_DVR_DEVICEINFO lpDeviceInfo, int *error,SocketStyle socketTyle=TCPSOCKET);   中的 CALL_METHOD  定义了#ifndef CALL_METHOD
    #define CALL_METHOD __stdcall  //__cdecl
    #endif
      

  3.   

    function H264_DVR_Login(sDVRIP:pchar;wDVRPort:Word;sUserName,sPassword:pchar;    var LPH264_DVR_DEVICEINFO:_H264_DVR_DEVICEINFO;iError:PInteger;Style: SmallInt = 0)如果还不行,调用时sDVRIP:pchar;wDVRPort:Word;sUserName,sPassword:pchar;这些变量定义为Arry of Char;
      

  4.   


    P_LPH264_DVR_DEVICEINFO=^_H264_DVR_DEVICEINFO;function H264_DVR_Login(sDVRIP:pchar;wDVRPort:Word;sUserName,sPassword:pchar;                         LPH264_DVR_DEVICEINFO:P_LPH264_DVR_DEVICEINFO;iError:PInteger;Style:PSmallInt):LongInt;stdcall;external 'NetSdk.dll' name 'H264_DVR_Login';   是不是需要这样定义,P_LPH264_DVR_DEVICEINFO这个应该是一个指针
      

  5.   

    下面是我调用
    var PH264:P_LPH264_DVR_DEVICEINFO;  
    GetMem(PH264,Sizeof(P_LPH264_DVR_DEVICEINFO) );
      lLogin:=H264_DVR_Login('192.168.0.10',34567,'admin','',PH264,iError,ord(TCPSOCKET));
      

  6.   

    1.Style:PSmallInt的PSmallInt改为SmallInt;
    2.调用修改为如下:
    var H264: _LPH264_DVR_DEVICEINFO;  
      lLogin:=H264_DVR_Login('192.168.0.10',34567,'admin','',@H264,iError,ord(TCPSOCKET)); 
      

  7.   

    1.如果你定义iError为: iError: integer; 那调用时,要在iError前加@
    type 
      SocketStyle = (TCPSOCKET=0,UDPSOCKET,SOCKETNR);
      _H264_DVR_DEVICEINFO = record
        ...
      end;
      LPH264_DVR_DEVICEINFO = ^_H264_DVR_DEVICEINFO;
      function H264_DVR_Login(sDVRIP:pchar;wDVRPort:Word;sUserName,sPassword:pchar;
        lpDeviceInfo:LPH264_DVR_DEVICEINFO;
        iError:PInteger;
        Style:SocketStyle=TCPSOCKET);var H264: _H264_DVR_DEVICEINFO;  
      lLogin:=H264_DVR_Login('192.168.0.10',34567,'admin','',@H264,@iError,TCPSOCKET);
    2.贴下你翻译的typedef struct _H264_DVR_DEVICEINFO结构
      

  8.   

    /// 设备类型
       SDK_DeviceType = (SDK_DEVICE_TYPE_DVR, ///< 普通DVR设备
        SDK_DEVICE_TYPE_NVS, ///< NVS设备
        SDK_DEVICE_TYPE_IPC, ///< IPC设备
        SDK_DEVICE_TYPE_HVR, ///<混合dvr
        SDK_DEVICE_TYPE_IVR, ///<智能dvr
        SDK_DEVICE_TYPE_MVR, ///<车载dvr
        SDK_DEVICE_TYPE_NR);   SocketStyle =(
          TCPSOCKET=0,
          UDPSOCKET,
          SOCKETNR);   /// 系统时间结构
     SDK_SYSTEM_TIME = packed record
          year:Integer;///< 年。
        month:Integer;///< 月,January = 1, February = 2, and so on.
        day:Integer;///< 日。
        wday:Integer;///< 星期,Sunday = 0, Monday = 1, and so on
        hour:Integer;///< 时。
        minute:Integer;///< 分。
        second:Integer;///< 秒。
        isdst:Integer;///< 夏令时标识。
      end;_H264_DVR_DEVICEINFO = record
           sSoftWareVersion:pchar;
           sHardWareVersion:pchar;
           sEncryptVersion:pchar;
           SDK_SYSTEM_TIME:SDK_SYSTEM_TIME;
           sSerialNumber:PChar;
           byChanNum,iVideoOutChannel,byAlarmInPortNum,byAlarmOutPortNum,iTalkInChannel,
           iTalkOutChannel,iExtraChannel,iAudioInChannel,iCombineSwitch,
           iDigChannel:Integer;
           uiDeviceRunTime:SDK_SYSTEM_TIME;
           deviceTye:SDK_DeviceType;
           sHardWare:pchar;
      end;
      

  9.   

    VC 
    /// 设备类型
    enum SDK_DeviceType
    {
    SDK_DEVICE_TYPE_DVR, ///< 普通DVR设备
    SDK_DEVICE_TYPE_NVS, ///< NVS设备
    SDK_DEVICE_TYPE_IPC, ///< IPC设备
    SDK_DEVICE_TYPE_HVR, ///<混合dvr
    SDK_DEVICE_TYPE_IVR, ///<智能dvr
    SDK_DEVICE_TYPE_MVR, ///<车载dvr
    SDK_DEVICE_TYPE_NR
    };
    /// 系统时间结构
    typedef struct SDK_SYSTEM_TIME{
    int  year;///< 年。   
    int  month;///< 月,January = 1, February = 2, and so on.   
    int  day;///< 日。   
    int  wday;///< 星期,Sunday = 0, Monday = 1, and so on   
    int  hour;///< 时。   
    int  minute;///< 分。   
    int  second;///< 秒。   
    int  isdst;///< 夏令时标识。   
    }SDK_SYSTEM_TIME;
      

  10.   


    按我上面说的第一步修改后还是出问题??将SDK_SYSTEM_TIME后面的packed去掉!!!SDK_SYSTEM_TIME = record
       year:Integer;///< 年。
        month:Integer;///< 月,January = 1, February = 2, and so on.
        day:Integer;///< 日。
        wday:Integer;///< 星期,Sunday = 0, Monday = 1, and so on
        hour:Integer;///< 时。
        minute:Integer;///< 分。
        second:Integer;///< 秒。
        isdst:Integer;///< 夏令时标识。
      end;
      

  11.   

    var H264: _H264_DVR_DEVICEINFO;
        Err:integer;
        iError:pInteger;
        sDVRIP:array[0..14] of char;
        sUserName, sPassword :array[0..7] of char;
    begin
     // GetMem(PH264,Sizeof(P_LPH264_DVR_DEVICEINFO));
      StrPCopy(sDVRIP,'192.168.0.10');
      StrPCopy(sUserName,'admin');
      StrPCopy(sPassword,'');
      lLogin:=H264_DVR_Login(sDVRIP,34567,sUserName,sPassword,@H264,@iError,(TCPSOCKET));  
    修改了,还是报错.....................
      

  12.   

    都告诉你iError要定义为Integer变量了,不要定义为PInteger。
    var H264: _H264_DVR_DEVICEINFO;
        iError:Integer;
    begin
      lLogin:=H264_DVR_Login('192.168.0.10',34567,'admin','',@H264,@iError,TCPSOCKET);
      

  13.   

    var H264: _H264_DVR_DEVICEINFO;
        Err:integer;
        iError:Integer;
        sDVRIP:array[0..14] of char;
        sUserName, sPassword :array[0..7] of char;
    begin
     // GetMem(PH264,Sizeof(P_LPH264_DVR_DEVICEINFO));
      StrPCopy(sDVRIP,'192.168.0.10');
      StrPCopy(sUserName,'admin');
      StrPCopy(sPassword,'');
      lLogin:=H264_DVR_Login(sDVRIP,34567,sUserName,sPassword,@H264,@iError,(TCPSOCKET));
      这样定义了
        还是报 Access violation at address 00000000,read of address 00000000
      

  14.   

    找到问题了
    H264_DVR_DEVICEINFO = record
           sSoftWareVersion:array[0..63] of Char;
           sHardWareVersion:array[0..63] of Char;
           sEncryptVersion:array[0..63] of Char;
           SDK_SYSTEM_TIME:SDK_SYSTEM_TIME;
           sSerialNumber:array[0..63] of Char;
           byChanNum,iVideoOutChannel,byAlarmInPortNum,byAlarmOutPortNum,iTalkInChannel,
           iTalkOutChannel,iExtraChannel,iAudioInChannel,iCombineSwitch,
           iDigChannel:Integer;
           uiDeviceRunTime:Word;
           deviceTye:SDK_DeviceType;
           sHardWare:array[0..63] of Char;
      end;