Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从VB6中解析MSDN C++ API调用和结构_C++_Api_Vb6_Sip - Fatal编程技术网

从VB6中解析MSDN C++ API调用和结构

从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更新数据库中的各种记录。我们在指向同一台计算机的各

我正在尝试从VB6应用程序调用TAPI32.dll上的函数。我不知道如何在VB6中指定信息并调用它。因此,这个问题是关于帮助从MSDN中解密C++相关信息,并从VB6调用它,但是我在下面详细地介绍了我们的具体用法,希望它有帮助。 我们的应用程序使用一个名为Dialogic的公司提供的SIP会话初始化协议栈,它允许我们处理传入的电话呼叫,读取DDI号码(呼叫者拨打的号码),以及呼叫者ID(呼叫者拨打的号码),为了处理这些信息,根据DDI和呼叫者ID更新数据库中的各种记录。我们在指向同一台计算机的各种VOIP线路/通道上有多个DDI。这一切都很好

在某些情况下,当警卫或看护人员未访问某个位置时,我们会拨出电话向主管播放WAV文件,并记录他们的存在。因此,我们使用DDI和呼叫者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函数的定义-

显示此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中简单地使用它。

请参阅