解密MSDN C API调用和结构,并从VB6调用
Deciphering MSDN C++ API calls and structures and calling from VB6
我正在尝试从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
中使用它。
- 用C++将哈希表写入文件并从文件中恢复
- 使用 pqxx 将 std::vector 存储在 postgresql 中,并从数据库中检索它
- C++ - 忽略并从其他文件获取数据
- 为什么我的 if else 语句不起作用并从数组中输出正确的索引?
- 在 c++ 中,如何返回多个对象并从 RVO 中受益
- 比较 2 个向量并从第二个向量中删除在第一个 - c++ 中找不到的元素
- 如何在 c# 代码中通过引用调用时从 c++ dll 更新数组值?
- 如何链接 DLL 以供 LoadLibrary() 使用(在 Windows 上的 C++ 中)并从调用 exe 导入变
- 将结构向量保存到文件中,并从C++文件中读取结构向量
- 获取类成员功能的地址并从指针调用
- 在 C# 中实现DISPID_VALUE并从C++调用它
- 创建非托管常规 MFC DLL 并从托管 C++ .NET 应用调用它时出现问题
- 解密MSDN C API调用和结构,并从VB6调用
- 在一个函数调用中创建线程池,并从另一个函数调用来使用它
- 为什么我不能将 cin/cout 放在一个函数中并从 main() 调用该函数
- 传递对象并从线程调用中获取返回值
- 如何在另一个包含对象的文件中创建一个函数并从 main 调用它
- Java - jna从Java调用本机循环,并从其他函数停止它
- 在web服务器上运行c++代码,并从应用程序调用它
- 如何编写函数并从main调用它们