从VB6中解析MSDN C++ API调用和结构
我正在尝试从VB6应用程序调用TAPI32.dll上的函数。我不知道如何在VB6中指定信息并调用它。因此,这个问题是关于帮助从MSDN中解密C++相关信息,并从VB6调用它,但是我在下面详细地介绍了我们的具体用法,希望它有帮助。 我们的应用程序使用一个名为Dialogic的公司提供的SIP会话初始化协议栈,它允许我们处理传入的电话呼叫,读取DDI号码(呼叫者拨打的号码),以及呼叫者ID(呼叫者拨打的号码),为了处理这些信息,根据DDI和呼叫者ID更新数据库中的各种记录。我们在指向同一台计算机的各种VOIP线路/通道上有多个DDI。这一切都很好 在某些情况下,当警卫或看护人员未访问某个位置时,我们会拨出电话向主管播放WAV文件,并记录他们的存在。因此,我们使用DDI和呼叫者ID信息 由于我们有多个DDI指向一台机器,我们希望能够选择其中一个号码——我相信在拨打外线电话时会呼叫呼叫呼叫方组号码,这样当主管接到他的手机呼叫时,他会看到他的员工呼叫的同一个号码,以注册他们在现场的存在 我们相信这些信息是在对TAPI32.dll的makelinecall调用中设置的 我们有这个声明从VB6中解析MSDN C++ API调用和结构,c++,api,vb6,sip,C++,Api,Vb6,Sip,我正在尝试从VB6应用程序调用TAPI32.dll上的函数。我不知道如何在VB6中指定信息并调用它。因此,这个问题是关于帮助从MSDN中解密C++相关信息,并从VB6调用它,但是我在下面详细地介绍了我们的具体用法,希望它有帮助。 我们的应用程序使用一个名为Dialogic的公司提供的SIP会话初始化协议栈,它允许我们处理传入的电话呼叫,读取DDI号码(呼叫者拨打的号码),以及呼叫者ID(呼叫者拨打的号码),为了处理这些信息,根据DDI和呼叫者ID更新数据库中的各种记录。我们在指向同一台计算机的各
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函数的定义-
显示此C++结构定义:-< /P>
LONG WINAPI lineMakeCall(
HLINE hLine,
LPHCALL lphCall,
LPCSTR lpszDestAddress,
DWORD dwCountryCode,
LPLINECALLPARAMS const lpCallParams
);
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;
最后一项LPLINECALLPARAMS是我们需要指定信息的地方,我相信
这个MSDN页面上的链接给出了C++结构定义:-< /P>
LONG WINAPI lineMakeCall(
HLINE hLine,
LPHCALL lphCall,
LPCSTR lpszDestAddress,
DWORD dwCountryCode,
LPLINECALLPARAMS const lpCallParams
);
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
及
在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)
一个是我正在呼叫的电话号码,一个是设置我正在使用的线路的呼叫者ID信息
然后我得到整个结构在内存中的地址,并从缓冲区部分在内存中的位置减去它。给我一个从结构开始的偏移量
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++以外的语言在设计和内存管理方面最难使用的语言之一。尝试使用基于COM技术实现的,因此您可以简单地在VB6中使用它。TAPI 2,您上面描述的是在设计和内存管理方面最难从C/C++以外的语言使用的语言之一。尝试使用基于COM技术实现的,因此您可以在VB6中简单地使用它。请参阅