c++ - 破译 MSDN C++ API 调用和结构以及从 VB6 调用

标签 c++ api vb6 sip

我正在尝试从 VB6 应用程序调用 TAPI32.dll 上的函数。我不知道如何在 VB6 中指定信息并调用它。所以,这个问题问的是帮助破译MSDN中的C++相关信息,并在VB6中调用它,但我在下面详细说明了我们的具体用法,希望对您有所帮助。

我们的应用程序使用来自一家名为 Dialogic 的公司的 SIP(​​ session 初始化协议(protocol))堆栈,它允许我们处理来电、读取 DDI 号码(调用者调用的号码)和他们的调用者 ID(调用者的号码)调用者正在调用),并处理该信息,根据 DDI 和调用者 ID 更新数据库中的各种记录。我们在指向同一台计算机的各种 VOIP 线路/ channel 上有多个 DDI。这一切都很好。

在某些情况下,当 guard 或护理人员尚未访问某个位置时,我们会拨出电话向主管播放 WAV 文件,并打电话记录他们的存在。因此我们使用 DDI 和来电显示信息。

因为我们有多个 DDI 指向一台机器,所以我们希望能够在拨出电话时选择其中一个号码(我认为是主叫方组号码),这样当主管接到他的手机电话时, 他看到他的员工在网站上注册时调用的电话号码相同。

我们认为该信息是在对 TAPI32.dll 的 makelinecall 调用中设置的

我们有这个声明......

Declare Function lineMakeCall Lib "TAPI32.DLL" Alias "lineMakeCallA" (ByVal hLine As Long, ByRef lphCall As Long, ByVal lpszDestAddress As String, ByVal dwCountryCode As Long, ByRef lpCallParams As Any) As Long

我的理解是,通过在 lpCallParams 结构上设置一些东西,我们应该能够指定 CPGN。我只是不知道该怎么做,因为我倾向于只在我的应用程序中提供可以从 COM 库轻松访问的功能,以及 VB6 可以轻松访问的 DLL。

此 MSDN 页面上的链接是 lineMakeCall API 函数的定义 - http://msdn.microsoft.com/en-us/library/windows/desktop/ms735988(v=vs.85).aspx

显示此 C++ 结构定义:-

LONG WINAPI lineMakeCall(
  HLINE hLine,
  LPHCALL lphCall,
  LPCSTR lpszDestAddress,
  DWORD dwCountryCode,
  LPLINECALLPARAMS const lpCallParams
);

最后一项 LPLINECALLPARAMS 是我们需要指定信息的地方,我相信。

此 MSDN 页面上的链接 - http://msdn.microsoft.com/en-us/library/windows/desktop/ms735534(v=vs.85).aspx给出这个 C++ 结构定义:-

typedef struct linecallparams_tag {
  DWORD          dwTotalSize;
  DWORD          dwBearerMode;
  DWORD          dwMinRate;
  DWORD          dwMaxRate;
  DWORD          dwMediaMode;
  DWORD          dwCallParamFlags;
  DWORD          dwAddressMode;
  DWORD          dwAddressID;
  LINEDIALPARAMS DialParams;
  DWORD          dwOrigAddressSize;
  DWORD          dwOrigAddressOffset;
  DWORD          dwDisplayableAddressSize;
  DWORD          dwDisplayableAddressOffset;
  DWORD          dwCalledPartySize;
  DWORD          dwCalledPartyOffset;
  DWORD          dwCommentSize;
  DWORD          dwCommentOffset;
  DWORD          dwUserUserInfoSize;
  DWORD          dwUserUserInfoOffset;
  DWORD          dwHighLevelCompSize;
  DWORD          dwHighLevelCompOffset;
  DWORD          dwLowLevelCompSize;
  DWORD          dwLowLevelCompOffset;
  DWORD          dwDevSpecificSize;
  DWORD          dwDevSpecificOffset;
  DWORD          dwPredictiveAutoTransferStates;
  DWORD          dwTargetAddressSize;
  DWORD          dwTargetAddressOffset;
  DWORD          dwSendingFlowspecSize;
  DWORD          dwSendingFlowspecOffset;
  DWORD          dwReceivingFlowspecSize;
  DWORD          dwReceivingFlowspecOffset;
  DWORD          dwDeviceClassSize;
  DWORD          dwDeviceClassOffset;
  DWORD          dwDeviceConfigSize;
  DWORD          dwDeviceConfigOffset;
  DWORD          dwCallDataSize;
  DWORD          dwCallDataOffset;
  DWORD          dwNoAnswerTimeout;
  DWORD          dwCallingPartyIDSize;
  DWORD          dwCallingPartyIDOffset;
  DWORD          dwAddressType;
} LINECALLPARAMS, *LPLINECALLPARAMS;

有趣的参数是 dwCallingPartyIDSize 和 dwCallingPartyIDOffset。 我不知道如何指定要传递给他们的信息

我们已经在 VB6 中设置了这些类型:-

Type LINECALLINFO
  lngTotalSize As Long
  lngNeededSize As Long
  lngUsedSize As Long
  lngLineHandle As Long
  lngLineDeviceID As Long
  lngAddressID As Long
  lngBearerMode As Long
  lngRate As Long
  lngMediaMode As Long
  lngAppSpecific As Long
  lngCallID As Long
  lngRelatedCallID As Long
  lngCallParamFlags As Long
  lngCallStates As Long
  lngMonitorDigitModes As Long
  lngMonitorMediaModes As Long
  DialParams As LINEDIALPARAMS
  lngOrigin As Long
  lngReason As Long
  lngCompletionID As Long
  lmgNumOwners As Long
  lngNumMonitors As Long
  lngCountryCode As Long
  lngTrunk As Long
  lngCallerIDFlags As Long
  lngCallerIDSize As Long
  lngCallerIDOffset As Long
  lngCallerIDNameSize As Long
  lngCallerIDNameOffset As Long
  lngCalledIDFlags As Long
  lngCalledIDSize As Long
  lngCalledIDOffset As Long
  lngCalledIDNameSize As Long
  lngCalledIDNameOffset As Long
  lngConnectedIDFlags As Long
  lngConnectedIDSize As Long
  lngConnectedIDOffset As Long
  lngConnectedIDNameSize As Long
  lngConnectedIDNameOffset As Long
  lngRedirectionIDFlags As Long
  lngRedirectionIDSize As Long
  lngRedirectionIDOffset As Long
  lngRedirectionIDNameSize As Long
  lngRedirectionIDNameOffset As Long
  lngRedirectingIDFlags As Long
  lngRedirectingIDSize As Long
  lngRedirectingIDOffset As Long
  lngRedirectingIDNameSize As Long
  lngRedirectingIDNameOffset As Long
  lngAppNameSize As Long
  lngAppNameOffset As Long
  lngDisplayableAddressSize As Long
  lngDisplayableAddressOffset As Long
  lngCalledPartySize As Long
  lngCalledPartyOffset As Long
  lngCommentSize As Long
  lngCommentOffset As Long
  lngDisplaySize As Long
  lngDisplayOffset As Long
  lngUserUserInfoSize As Long
  lngUserUserInfoOffset As Long
  lngHighLevelCompSize As Long
  lngHighLevelCompOffset As Long
  lngLowLevelCompSize As Long
  lngLowLevelCompOffset As Long
  lngChargingInfoSize As Long
  lngChargingInfoOffset As Long
  lngTerminalModesSize As Long
  lngTerminalModesOffset As Long
  lngDevSpecificSize As Long
  lngDevSpecificOffset As Long
  ' Extra Data buffer
  vbByteBuffer(0 To 2048) As Byte
End Type

Public Type LINECALLPARAMS
    lngTotalSize As Long
    lngBearerMode As Long
    lngMinRate As Long
    lngMaxRate As Long
    lngMediaMode As Long
    lngCallParamFlags As Long
    lngAddressMode As Long
    lngAddressID As Long
    DialParams As LINEDIALPARAMS
    lngOrigAddressSize As Long
    lngOrigAddressOffset As Long
    lngDisplayableAddressSize As Long
    lngDisplayableAddressOffset As Long
    lngCalledPartySize As Long
    lngCalledPartyOffset As Long
    lngCommentSize As Long
    lngCommentOffset As Long
    lngUserUserInfoSize As Long
    lngUserUserInfoOffset As Long
    lngHighLevelCompSize As Long
    lngHighLevelCompOffset As Long
    lngLowLevelCompSize As Long
    lngLowLevelCompOffset As Long
    lngDevSpecificSize As Long
    lngDevSpecificOffset As Long
'#if (TAPI_CURRENT_VERSION >= 0x00020000)
    lngPredictiveAutoTransferStates As Long
    lngTargetAddressSize As Long
    lngTargetAddressOffset As Long
    lngSendingFlowspecSize As Long
    lngSendingFlowspecOffset As Long
    lngReceivingFlowspecSize As Long
    lngReceivingFlowspecOffset As Long
    lngDeviceClassSize As Long
    lngDeviceClassOffset As Long
    lngDeviceConfigSize As Long
    lngDeviceConfigOffset As Long
    lngCallDataSize As Long
    lngCallDataOffset As Long
    lngNoAnswerTimeout As Long
    lngCallingPartyIDSize As Long
    lngCallingPartyIDOffset As Long
'#End If
    vbByteBuffer(0 To 2047) As Byte
End Type

在 LINECALLPARAMS 的末尾,我现在在可变长度数据的类型声明末尾有一个缓冲区。

vbByteBuffer(0 To 2047) As Byte

然后我像这样设置尺寸参数:-

typCallParams.lngTotalSize = Len(typCallParams)

并设置我想在结构的可变数据部分指定的两个电话号码的大小。

typCallParams.lngCallingPartyIDSize = 12
typCallParams.lngCalledPartySize = 12

一个是我调用的电话号码,一个是设置我正在使用的线路的来电显示信息。

然后我得到整个结构在内存中的地址,并从缓冲区部分在内存中的位置减去它。从结构的开头给我一个偏移量。

Dim StartOfType As Long
Dim StartOfBufferOffset As Long
StartOfType = VarPtr(typCallParams) ' address
StartOfBufferOffset = VarPtr(typCallParams.vbByteBuffer(0)) - VarPtr(typCallParams)

然后我尝试在缓冲区中设置一些数据。

'calling
typCallParams.vbByteBuffer(0) = CByte("0")
typCallParams.vbByteBuffer(1) = CByte("1")
typCallParams.vbByteBuffer(2) = CByte("2")
typCallParams.vbByteBuffer(3) = CByte("3")
typCallParams.vbByteBuffer(4) = CByte("4")
typCallParams.vbByteBuffer(5) = CByte("1")
typCallParams.vbByteBuffer(6) = CByte("2")
typCallParams.vbByteBuffer(7) = CByte("3")
typCallParams.vbByteBuffer(8) = CByte("4")
typCallParams.vbByteBuffer(9) = CByte("5")
typCallParams.vbByteBuffer(10) = CByte("6")
typCallParams.vbByteBuffer(11) = CByte(0)

'called
typCallParams.vbByteBuffer(112) = CByte("0")
typCallParams.vbByteBuffer(113) = CByte("1")
typCallParams.vbByteBuffer(114) = CByte("5")
typCallParams.vbByteBuffer(115) = CByte("4")
typCallParams.vbByteBuffer(116) = CByte("3")
typCallParams.vbByteBuffer(117) = CByte("6")
typCallParams.vbByteBuffer(118) = CByte("5")
typCallParams.vbByteBuffer(119) = CByte("4")
typCallParams.vbByteBuffer(120) = CByte("3")
typCallParams.vbByteBuffer(121) = CByte("2")
typCallParams.vbByteBuffer(122) = CByte("1")
typCallParams.vbByteBuffer(123) = CByte(0)

然后指向偏移量:-

typCallParams.lngCallingPartyIDOffset = StartOfBufferOffset
typCallParams.lngCalledPartyOffset = StartOfBufferOffset + 112

请注意,我故意在两个信息位之间留了一大块空间,并将下一个偏移量向前偏移了 100 个字节。

然后我进行 API 调用。

lngResult = lineMakeCall(mlngLineHandle, mlngCallHandle, "", 0, typCallParams)

它还没有完全实现……但我认为我们离得太远了。

如有任何帮助,我们将不胜感激。

最佳答案

TAPI 您上面描述的 2 是最难用于 C/C++ 以外的语言的设计和内存管理之一。尝试使用 TAPI 3.x它是基于COM技术实现的,因此您可以简单地在VB6中使用它。

关于c++ - 破译 MSDN C++ API 调用和结构以及从 VB6 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13027014/

相关文章:

vb6 - 为什么我的 VB6 应用程序 list 在 64 位机器上被忽略?

VB6 ADO 记录集限制

sql - 如何从SQL中选择给定时间间隔之间的数据

c++ - 访问正在运行的线程

c++ - 网络应用程序有多少传入缓冲区?

javascript - JS、多个JSON请求和回调函数

windows - 如何在不出现临时中断的情况下扩展我的 Azure 应用程序?

javascript - 是否可以通过网络浏览器 api 访问移动设备的电池状态或充电?

C++ 错误类型 'std::thread' 无法解析 Eclipse Mars 4.5,Ubuntu 12.04

c++ - while 循环因 eof 检查停止得太晚