【发布时间】:2020-08-06 07:01:31
【问题描述】:
目前我有一个问题,我应该迁移一个通过 Cisco TAPI 进行通信的工具。目前它在 32 位编译下运行。
如果我将编译集切换为 64 位并将 nuget 包“ATAPI”(由 Mark Smith 编写)更新为 64 位版本。
如果我构建并测试它,TAPI 日志会显示 dwSize 不匹配。我试图为 CiscoDevSpecific-structs 设置一个明确的 StructLayout(如建议的here )。但同样的错误出现在日志文件中。
错误信息
15:44:51.105 | TSPI_lineGetAddressStatus() TSPI_lineGetAddressStatus returns = 0x00000000
15:44:51.106 | TSPI_lineDevSpecific()
dwRequestID: 0x000105AF hdLine: 0x175B4B30 dwAddressID: 0x00000000 hdCall: 0x00000000 lpParams: 0x202D6E98 dwSize: 32
15:44:51.106 | CSelsiusTSPLine::DevSpecific() [0x00000D32] *ERROR* dwSize mis-match 0x00000020
15:44:51.106 | TSPI_lineDevSpecific() TSPI_lineDevSpecific returns = 0x80000048
例如,StartCallMonitoring 的结构看起来像
[StructLayout(LayoutKind.Explicit, Size = 32)]
public struct CiscoLineDevSpecificStartCallMonitoring
{
[FieldOffset(0)]
public int m_MsgType;
[FieldOffset(8)]
public int m_PermanentLineID;
[FieldOffset(16)]
public int m_MonitorMode; //0= NONE, 1=SILENT, 2=WHISPER, 3=ACTIVE
[FieldOffset(24)]
public int m_ToneDirection; //0=LOCALONLY, 1=REMOTEONLY, 2=BOTH, 3=NOTLOCALORREMOTE
}
初始化之类的
var cisco = new CiscoLineDevSpecificStartCallMonitoring
{
m_MsgType = (int)CiscoLineDevSpecificType.SLDST_START_CALL_MONITORING,
m_PermanentLineID = permanentIdOfTargetLine,
m_MonitorMode = (int)monitorMode,
m_ToneDirection = (int)PlayToneDirection.PlayToneDirectionNoLocalOrRemote
};
Bytes 的计算如下:
private static byte[] GetBytes(object msg)
{
var size = Marshal.SizeOf(msg);
var arr = new byte[size];
var ptr = Marshal.AllocHGlobal(size);
Marshal.StructureToPtr(msg, ptr, true);
Marshal.Copy(ptr, arr, 0, size);
Marshal.FreeHGlobal(ptr);
return arr;
}
感谢您的回复。
https://community.cisco.com/t5/collaboration-documents/tsp-x64-devspecific-dword-size-mismatch-problem/ta-p/3613828 https://github.com/markjulmar/atapi.net
【问题讨论】:
-
一个格式和公式化的问题 - 太好了!