我正在尝试从 VB6 应用程序调用 TAPI32.dll 上的函数。我不知道如何在 VB6 中指定信息并调用它。所以,这个问题是询问从MSDN解密C ++相关信息的帮助,并从VB6调用它,但我在下面详细说明了我们的具体用法,希望它有所帮助。
我们的应用程序使用来自一家名为 Dialogic 的公司的 SIP(会话初始化协议)堆栈,它允许我们处理来电、读取 DDI 号码(呼叫者拨打的号码)和他们的呼叫者 ID(呼叫者正在呼叫的号码from),并根据 DDI 和 Caller ID 处理更新数据库中各种记录的信息。我们在指向同一台计算机的各种 VOIP 线路/通道上有多个 DDI。这一切都很好。
在某些情况下,当警卫或看护人没有访问某个位置时,我们会向主管发出 WAV 文件,并打电话记录他们的存在。因此我们使用 DDI 和 Caller ID 信息。
由于我们有多个 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)
它并不完全在那里......但我不认为我们离得太远了。
任何帮助将不胜感激。