- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试从 VB6 应用程序调用 TAPI32.dll 上的函数。我不知道如何在 VB6 中指定信息并调用它。所以,这个问题问的是帮助破译MSDN中的C++相关信息,并在VB6中调用它,但我在下面详细说明了我们的具体用法,希望对您有所帮助。
我们的应用程序使用来自一家名为 Dialogic 的公司的 SIP( session 初始化协议(protocol))堆栈,它允许我们处理来电、读取 DDI 号码(调用者调用的号码)和他们的调用者 ID(调用者的号码)调用者正在调用),并处理该信息,根据 DDI 和调用者 ID 更新数据库中的各种记录。我们在指向同一台计算机的各种 VOIP 线路/ channel 上有多个 DDI。这一切都很好。
在某些情况下,当 guard 或护理人员尚未访问某个位置时,我们会拨出电话向主管播放 WAV 文件,并打电话记录他们的存在。因此我们使用 DDI 和来电显示信息。
因为我们有多个 DDI 指向一台机器,所以我们希望能够在拨出电话时选择其中一个号码(我认为是主叫方组号码),这样当主管接到他的手机电话时, 他看到他的员工在网站上注册时调用的电话号码相同。
我们认为该信息是在对 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)
并设置我想在结构的可变数据部分指定的两个电话号码的大小。
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++ 以外的语言的设计和内存管理之一。尝试使用 TAPI 3.x它是基于COM技术实现的,因此您可以简单地在VB6
中使用它。
关于c++ - 破译 MSDN C++ API 调用和结构以及从 VB6 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13027014/
有人提出了类似的问题:MSDN subscriptions on the cheap? ,但我对提供的解决方案不感兴趣: 我不是在开发用于销售的产品,而是在创办一家咨询公司,因此 Empower 不是
我一直在 .NET 编程专业工作了三年,我一直在寻求磨砺我的工具。我是一家公司的独家开发人员,该公司最近购买了 MSDN 订阅以及 Visual Studio 2008专业的。订阅有哪些用处? 我习惯
有没有办法关闭MSDN 库页面的自动文本翻译? 我确实更喜欢英文文本,但由于拥有德语 IP 地址,微软会在每个新页面加载时激活自动翻译,这会给我一个黄色框,其中包含我当前用鼠标悬停在其上的文本的德语翻
我知道这个问题有点异端,但我很好奇...... 当然,也有特快版。但是,当微软在 OSS 世界中有效地争夺“人心”时,向全心全意支持 .NET 的开发人员收取高昂的微软软件订阅费似乎有点适得其反。很难
想知道这里是否还有其他人注册了相同的程序并可以给我一些建议。我在一两个月前的某个时候注册了 Microsoft BizSpark 计划,并激活了该计划附带的 MSDN 订阅。 在我登录到 MSDN 门
我一直被一个问题困扰:“Javadoc、Doxygen 等等……微软真的有可能不为其开发人员提供良好的文档生成器吗?”。它对我来说一直听起来很奇怪......也因为 Msdn 是一个非常好的文档排版.
我试图做一些遗留工作,并在 MSDN 上查找了 Visual C++ 6。我再也看不到它了,我能做的最好的是 Visual C++ 4.2! 有谁知道为什么会这样?有没有办法从 MSDN 获取它? 最
我升级到 Visual Studio 2010 RC,我记得为 MSDN 帮助改进事件填写了一个大表格,我想知道我会看到 Visual Studio 2008 中包含一个类似 MSDN 的帮助查看器,
我在一家小型数字营销公司工作,担任程序员,我们不是 Microsoft 合作伙伴或任何类型(金/银/铜)。但是,我们使用 .NET。 我感到困惑的是,我之前的开发人员已经离开,他获得了最新 Micro
首先,请不要以为这不是编程相关的问题,因为它非常重要。 当我在高中使用VB 6时,MSDN简直太棒了,我再也没有在其他地方寻求帮助。然后是整个.net和在线MSDN,什么也没有,并且不再有任何实际示例
我只是一个人的软件商店,并且目前有MSDN订阅。它即将更新,看起来好像要花一小笔钱。我看到TechNet订阅的费用大大减少,并且似乎包括所有相同的软件。我在这里想念什么吗?这两个软件包之间有什么区别?
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
我知道这不完全是编程问题,但它是紧密相关的 - 到底如何设置 MSDN 以英文显示所有内容?我是捷克人,每一篇知识库或文档文章都会通过翻译器自动翻译为捷克语,这只会导致乱码,而将其切换为英语需要几次搜
我觉得问这个问题有点愚蠢,但我希望这对其他人也有帮助。 背景:我们/我正在使用Visual Studio 2008 SP1 (VC9)开发一些软件。我们希望随 CD 上的软件一起提供 vcredist
有没有办法以编程方式查询 MSDN.com?本质上,我有一个类名、命名空间或其他标识符,并希望找到 MSDN 文档页面,最好也传递一个版本(.net 3.5、.net 4.0、Silverlight
关闭。这个问题是 off-topic 。它目前不接受答案。 想改善这个问题吗? Update the question 所以它是堆栈溢出的 on-topic。 9年前关闭。 Improve this
我注意到 MSDN 在提及事件及其事件处理程序时多次使用“错误”术语。例如: The ProfileAutoSaving event is raised at the end of page exec
MSDN 订阅使开发人员可以访问 Visual Studio 2010 和最新的 Microsoft 平台进行开发和测试。 Microsft MSDN 订阅白皮书指出,通过“企业协议(protocol
今天在看MSDN的时候,遇到了如下代码: void draw( int I, long L ); long sq( int s ); int main() { long y; int x; y = s
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 9年前关闭。 Improve this q
我是一名优秀的程序员,十分优秀!