首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

delphi调用VC开发的DLL,调用OK,历次程序退出后报错

2012-12-24 
delphi调用VC开发的DLL,调用OK,每次程序退出后报错用VC开发的DLL,实现SIP软电话功能,需要用回调函数来实现

delphi调用VC开发的DLL,调用OK,每次程序退出后报错
用VC开发的DLL,实现SIP软电话功能,需要用回调函数来实现。接口部分的代码均编译通过而且启动时候初始化成功,可是每次程序退出后均报错。不知道是调用的原因还是DLL的调用约定异常。一时间排查不出。下文分别是DLL接口的部分代码以及在DELPHI中定义的接口代码。请大家看看是什么原因?
DLL接口的部分代码
#ifndef __SIPPHONE_INTERFACE_H_INCLUDED_
#define __SIPPHONE_INTERFACE_H_INCLUDED_

#ifdef __cplusplus
extern "C" {
#endif

//////////////////////////////////////////////////////////////////////
// Macro/Struct definition
//////////////////////////////////////////////////////////////////////

typedef DWORD (WINAPI * CALLBACKFUN)(UINT uMsg,DWORD dwUserInstance,WPARAM wParam, LPARAM lParam);

//给应用层消息定义,对应回调函数的第一个参数UINT uMsg
enum SEND_APP_MSG
{
    MSG_SIP_CALLIN_FAIL,
    MSG_SIP_CALLIN_RINGING,
    MSG_SIP_CALLIN_CONNECT,
    MSG_SIP_RECV_INFO,
    MSG_SIP_CALLOUT_RING,
    MSG_SIP_CALLOUT_FAIL,
    MSG_SIP_CALLOUT_CONNECT,
    
    MSG_SIP_CALL_HONGOFF
};

#define RETURN_SUCCESS                  0   //返回成功
//error code define
#define ERR_INPUT_PARAM_ERROR           1   //输入参数错误
#define ERR_SIP_PROC_NOTSTART           2   //SIP服务没有启动
#define ERR_SIP_PROC_ALREADYSTART       3   //已经启动
#define ERR_SIP_PROC_INITFAIL           4   //初始化失败
#define ERR_SIP_PROC_LISTENPORTFAIL     5   //SIP监听的端口错误
#define ERR_SIP_PROC_LISTENADDRFAIL     6   //SIP监听的地址错误
#define ERR_SIP_PROC_STARTTHREADFAIL    7   //启动工作线程失败
#define ERR_SIP_CALL_STATEERROR         8   //SIP呼叫时状态不一致
#define ERR_SIP_CALL_BUILDANSWERFAIL    9   //SIP呼叫时建立ANSWER消息失败
#define ERR_SIP_CALL_BUILDINVITEFAIL    10  //SIP呼叫时建立INVITE消息失败



//////////////////////////////////////////////////////////////////////
// APP Function statement
//////////////////////////////////////////////////////////////////////
//Function
/****************************************************************
* Function:    SIP_Start
* Description:Start
* Parameter:      
*   int listenPort:SIP监听端口号,必须大于1024  
*   CALLBACKFUN lpfSIPProcCallBack:回调函数
*   DWORD dwInstance:传入this指针
* Return:         
*   返回RETURN_SUCCESS成功,其他值失败 
*****************************************************************/
int WINAPI SIP_Start(int listenPort,
                 CALLBACKFUN lpfSIPProcCallBack = NULL,
                 DWORD dwInstance = NULL);

/****************************************************************
* Function:    SIP_Stop
* Description:stop
* Parameter:    无


* Return:       无
*****************************************************************/
void WINAPI SIP_Stop();
后面部分省略。。。。

下文是delphi部分的接口代码.....
unit USIPPhoneInterface;

interface

uses windows;

// 定义系统参数的结构
Type

  TMSG_SIPAPP_SEND =
  (
     MSG_SIP_CALLIN_FAIL,
     MSG_SIP_CALLIN_RINGING,
     MSG_SIP_CALLIN_CONNECT,
     MSG_SIP_RECV_INFO,
     MSG_SIP_CALLOUT_RING,
     MSG_SIP_CALLOUT_FAIL,
     MSG_SIP_CALLOUT_CONNECT,
     MSG_SIP_CALL_HONGOFF
  );

  
   TpEventHandler= Function (dwEvent:TMSG_SIPAPP_SEND;pUserInstance : pointer;strResult: pchar;nLenResult:integer):integer;

  
const
  RETURN_SUCCESS                = $00;   //返回成功
  ERR_INPUT_PARAM_ERROR         = $01;   //输入参数错误
  ERR_SIP_PROC_NOTSTART         = $02;   //SIP服务没有启动
  ERR_SIP_PROC_ALREADYSTART     = $03;   //已经启动
  ERR_SIP_PROC_INITFAIL         = $04;   //初始化失败
  ERR_SIP_PROC_LISTENPORTFAIL   = $05;   //SIP监听的端口错误
  ERR_SIP_PROC_LISTENADDRFAIL   = $06;   //SIP监听的地址错误
  ERR_SIP_PROC_STARTTHREADFAIL  = $07;   //启动工作线程失败
  ERR_SIP_CALL_STATEERROR       = $08;   //SIP呼叫时状态不一致
  ERR_SIP_CALL_BUILDANSWERFAIL  = $09;   //SIP呼叫时建立ANSWER消息失败
  ERR_SIP_CALL_BUILDINVITEFAIL  = $0A;   //SIP呼叫时建立INVITE消息失败
 
Const
  SIPPhoneClient_DLL = 'SIPPhoneLib.dll';           //SIPPhone通讯连接接口DLL

  {/****************************************************************
  * Function:    SIP_Start
  * Description:Start
  * Parameter:
  *   int listenPort:SIP监听端口号,必须大于1024
  *   CALLBACKFUN lpfSIPProcCallBack:回调函数
  *   DWORD dwInstance:传入this指针
  * Return:
  *   返回RETURN_SUCCESS=$00成功,其他值失败
  *****************************************************************/ }
  Function SIPServer_Start(nPort:DWORD;mCallBackEvent: TpEventHandler=NIL;lp:Pointer=nil):integer;stdcall;

  {/****************************************************************
  * Function:    SIP_Stop
  * Description:stop
  * Parameter:    无
  * Return:       无
  *****************************************************************/}
  procedure SIPServer_Stop();stdcall;


implementation

  Function SIPServer_Start;external SIPPhoneClient_DLL name 'SIP_Start';
  procedure  SIPServer_Stop;  external SIPPhoneClient_DLL name 'SIP_Stop';


end.

===================================================================================
下文是主程序回调函数的声明、定义以及调用
  Function SIPPhoneClientHander(nMsgID:TMSG_SIPAPP_SEND;pUserInstance : pointer;strResult: pchar;nLenResult:integer):integer;stdcall;
....
implementation

Function SIPPhoneClientHander(nMsgID:TMSG_SIPAPP_SEND;pUserInstance : pointer;strResult: pchar;nLenResult:integer):integer;
Begin
  if WaitForSingleObject(FrmMain.MainHMutex,INFINITE)=WAIT_OBJECT_0 then
  Begin
    try
      Case nMsgID of
        MSG_SIP_CALLIN_FAIL:
        Begin
        End;
      End; {end of case statement}
    Finally
      ReleaseMutex(FrmMain.MainHMutex);
    end;
  End;
End;

//初始化DLL接口
procedure TFrmMain.FormShow(Sender: TObject);
var
  bInitFlag : integer;
  str : string;
begin
 
  bDJInitFlag := DJServer_Start(51888, @SIPPhoneClientHander,self);
  str := Format('服务器的初始化为: %d',[bDJInitFlag]);
  showmessage(str);
end;

上述代码均成功,但是系统在退出后(编译环境中),出现堆栈错误。

[解决办法]
你这个代码很乱,好多地方都没有申明清楚,不过你把Delphi的声明里加个stdcall就好了
有必要说的是Dll函数的调用有好几种,参数顺序有从左到右和从右到左,参数释放有调用者和
被调用者或者是栈传递,不过一般用的最多的就是stdcall, 你在C中声明的WINAPI就是这个意思,
所以Delphi里也要加这个
[解决办法]
不能用stdcall 用 CDECL

热点排行