1

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)

まだそこまでではありませんが、それほど遠くないとは思います。

どんな援助でも大歓迎です。

4

1 に答える 1

1

TAPI上記で説明した 2 は、C/C++ 以外の言語から使用するのが設計およびメモリ管理で最も難しいものの 1 つです。COM テクノロジに基づいて実装されているTAPI 3.xを使用してみてくださいVB6

于 2012-10-23T09:36:06.867 に答える