2012-10-23 35 views
1

我想從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) 

這不是那裏......但我不認爲我們太遙遠了。

任何援助將非常感激。

+0

請參閱[Microsoft關於從VB6調用C++ DLL的注意事項](http://vb.mvps.org/tips/vb5dll.asp) – MarkJ

回答

1

TAPI 2上面描述的是從C/C++以外的語言中使用的設計和內存管理中最難的一種。嘗試使用基於COM技術的TAPI 3.x,因此您可以簡單地在VB6中使用它。

+0

我認爲有一個WAS TAPI 3.x 我會研究它,歡呼聲。 – cometbill