Я пытаюсь вызвать функцию на TAPI32.dll из приложения VB6. Я не могу понять, как указать информацию в VB6 и вызвать ее. Итак, этот вопрос задает вопрос о помощи в расшифровке информации, связанной с C ++, из MSDN и вызове ее из VB6, но я подробно остановился на нашем конкретном использовании, в надежде, что это поможет.
Наше приложение использует стек SIP (Session Initializatio Protocol) от компании Dialogic, которая позволяет нам обрабатывать входящие телефонные звонки, считывать номер DDI (номер, набранный вызывающим абонентом), и их идентификатор вызывающего абонента (номер, вызываемый вызывающим абонентом). from) и обрабатывать эту информацию, обновляя различные записи в базе данных на основе DDI и идентификатора вызывающего абонента. У нас есть несколько DDI на различных линиях / каналах VOIP, указывающих на один и тот же компьютер. Это все прекрасно работает.
При определенных обстоятельствах мы совершаем исходящие звонки, чтобы воспроизвести файл WAV для руководителей, когда охранник или опекун не посещали определенное место и звонили, чтобы записать их присутствие. Следовательно, мы используем информацию DDI и Caller ID.
Поскольку у нас есть несколько DDI, указывающих на одну машину, мы хотели бы иметь возможность выбрать один из этих номеров (номер группы вызывающей стороны, на мой взгляд, он вызывается) при совершении исходящих вызовов, чтобы, когда руководитель получает вызов на свой мобильный телефон, он видит тот же номер, по которому его сотрудники звонят, чтобы зарегистрировать свое присутствие на сайте.
Мы считаем, что информация установлена при вызове makelinecall к TAPI32.dll.
У нас есть это заявление …
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, к которым VB6 может легко получить доступ.
Ссылка на этой странице MSDN является определением функции API lineMakeCall — 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 ++. Попробуйте использовать ТАПИ 3.х который реализован на основе технологии COM, и, таким образом, вы можете просто использовать его в VB6
,
Других решений пока нет …