我想從VB6應用程序調用TAPI32.dll上的函數。我無法弄清楚如何在VB6中指定信息並調用它。所以,這個問題是關於幫助解密來自MSDN的C++相關信息,並從VB6中調用它,但我在下面詳細介紹了具體的用法,希望對它有所幫助。解密MSDN C++ API調用和結構並從VB6調用
我們的應用程序使用來自Dialogic公司的SIP(會話初始化協議)堆棧,它允許我們處理來電電話,讀取DDI號碼(來電者撥打的號碼)和來電顯示號碼調用者正在呼叫),並根據DDI和呼叫者ID來處理更新數據庫中的各種記錄的信息。我們在指向同一臺計算機的各種VOIP線路/信道上有多個DDI。這一切都很好。
在某些情況下,當警衛或看護者未訪問某個特定位置時,我們會打出一個WAV文件給監督員,然後呼叫記錄他們的存在。因此我們使用DDI和來電顯示信息。
由於我們有多個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庫輕鬆訪問的功能,以及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)
這不是那裏......但我不認爲我們太遙遠了。
任何援助將非常感激。
請參閱[Microsoft關於從VB6調用C++ DLL的注意事項](http://vb.mvps.org/tips/vb5dll.asp) – MarkJ