VB6 アプリケーションから TAPI32.dll の関数を呼び出そうとしています。VB6で情報を指定して呼び出す方法がわかりません。したがって、この質問は、MSDN からの C++ 関連情報を解読し、VB6 から呼び出す方法について尋ねていますが、役立つことを願って、特定の使用法を以下に詳しく説明しました。
私たちのアプリケーションは、Dialogic という会社の SIP (Session Initialization Protocol) スタックを使用しています。これにより、着信通話を処理し、DDI 番号 (発信者がダイヤルした番号) と発信者 ID (発信者が呼び出している番号) を読み取ることができます。から)、および DDI と発信者 ID に基づいてデータベース内のさまざまなレコードを更新するその情報を処理します。同じコンピューターを指すさまざまな VOIP 回線/チャネルに複数の DDI があります。これはすべて完全に正常に機能します。
特定の状況下では、警備員または介護者が特定の場所を訪問していないときに、監督者に WAV ファイルを再生するために電話をかけ、その存在を記録するために電話をかけます。したがって、DDI と発信者 ID 情報を使用します。
1 台のマシンを指している複数の DDI があるため、スーパーバイザが自分の携帯電話へのコールを受信したときに、スーパーバイザが見ることができるように、発信コールを行うときにこれらの番号の 1 つを選択できるようにしたいと考えています彼の従業員が現場での存在を登録するために呼び出すのと同じ番号です。
この情報は、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 関数の定義です - 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)
構造体の変数データ部分で指定したい 2 つの電話番号のサイズを設定します。
typCallParams.lngCallingPartyIDSize = 12
typCallParams.lngCalledPartySize = 12
1 つは自分がかけている電話番号用で、もう 1 つは自分が使用している回線の発信者 ID 情報を設定するためのものです。
次に、メモリ内の構造体全体のアドレスを取得し、バッファ部分のメモリ内の場所からそれを減算します。構造の先頭からのオフセットを教えてください。
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
2 ビットの情報の間に意図的に大きなスペースを残し、次のオフセットを 100 バイト先に設定したことに注意してください。
次に、API 呼び出しを行います。
lngResult = lineMakeCall(mlngLineHandle, mlngCallHandle, "", 0, typCallParams)
まだそこまでではありませんが、それほど遠くないとは思います。
どんな援助でも大歓迎です。