解密MSDN C API调用和结构,并从VB6调用

Deciphering MSDN C++ API calls and structures and calling from VB6

本文关键字:调用 并从 VB6 结构 API 解密 MSDN      更新时间:2023-10-16

我正在尝试从vb6应用程序上调用tapi32.dll的函数。我不知道如何在VB6中指定信息并调用它。因此,这个问题是在询问帮助MSDN的C 相关信息的帮助,并从VB6拨打它,但我在我们的特定用法下详细介绍了它,希望它能有所帮助。

我们的应用程序使用一个名为Dialogic的公司的SIP(会话初始化协议)堆栈,该公司允许我们处理传入的电话,读取DDI号码(拨号拨号)及其呼叫者ID(数字呼叫者正在呼叫),并根据DDI和呼叫者ID来处理该信息,以更新数据库中的各种记录。我们在指向同一台计算机的各种VoIP线/通道上有多个DDI。这一切都很好。

在某些情况下,当警卫或护理人员没有访问某个位置并呼吁记录他们的存在时,我们就会向主管播放WAV文件。因此,我们使用DDI和呼叫者ID信息。

由于我们有多个DDI指向一台机器,因此我们希望能够在拨出呼叫时选择其中一个(我相信是呼叫派对组号),以便当主管接收到他的移动设备的电话时,他看到员工呼吁在网站上注册其存在的数字。

我们认为,这些信息设置在tapi32.dll

的makelinecall call上。

我们有此声明...

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库中访问的功能,而dll可以轻松访问。

此MSDN页面上的链接是LineMakeCall API函数的定义-http://msdn.microsoft.com/en-us/library/windows/windows/desktop/mms735988(V=VS.85)P>

显示此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

i然后将大小参数设置为这样: -

typCallParams.lngTotalSize = Len(typCallParams)

并设置了我想在结构的变量数据部分中指定的两个电话号码的尺寸。

typCallParams.lngCallingPartyIDSize = 12
typCallParams.lngCalledPartySize = 12

一个是我要打电话的电话号码,一个是为我使用的行设置呼叫者ID信息。

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

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 以外的其他语言中使用的。尝试使用基于COM技术实现的TAPI 3.X,因此您可以在VB6中使用它。