gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:03:49 26 4
gpt4 key购买 nike

我正在尝试从 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com