2

有谁知道类似于 SafeHandle 的实现,它不使用我可以从中派生的 IntPtr?还是我应该完全创建一个新句柄?我需要像 DangerousGetHandle() 和 SetHandle() 这样的功能,因为它们在我使用的整个库中都使用过。

我问的原因是我正在编写一个使用 Atapi 托管 .NET 库的 TAPI 2.x 应用程序(可在此处获得: http: //atapi.codeplex.com/)。该应用程序面向 32 位和 64 位平台,目前在 32 位上运行良好,但在 64 位上运行时,它会在库的 TapiCall 类中的这一行中引发错误:

rc = NativeMethods.lineGetCallStatus(_hCall, pLcs);

异常详细信息的第一行:

System.ObjectDisposedException was unhandled
Message=Safe handle has been closed
Source=mscorlib
ObjectName=""
StackTrace:
at System.StubHelpers.StubHelpers.SafeHandleC2NHelper(Object pThis, IntPtr pCleanupWorkList)
at JulMar.Atapi.Interop.NativeMethods.lineGetCallStatus(HTCALL hCall, IntPtr lpCallStatus)

我追溯了一些调用,并认为问题的根源是对 Tapi32.dll 中的本机函数的以下调用:

int rc = NativeMethods.lineMakeCall(Line.Handle, out hCall, address, countryCode, lpCp);

(在 TAPI 中定义:http: //msdn.microsoft.com/en-us/library/ms735988 (VS.85).aspx )

64 位中的 hCall 值为“0”,而 32 位中为 5 位句柄。其他参数的值似乎没问题,并且在两个平台上都是相同的。

我的猜测是部分问题出在 Line.Handle 上,它源自 SafeHandle,在库中定义如下:

[SecurityPermission(SecurityAction.Demand, UnmanagedCode = true)]
internal class HTLINE : SafeHandle
{
    internal HTLINE()
        : base(IntPtr.Zero, true)
    {
    }

    internal HTLINE(IntPtr preexistingHandle, bool ownsHandle)
        : base(preexistingHandle, ownsHandle)
    {
    }

    protected override bool ReleaseHandle()
    {
        if (handle != IntPtr.Zero)
        {
            NativeMethods.lineClose(handle);
            handle = IntPtr.Zero;
        }
        return true;
    }

    public override bool IsInvalid
    {
        get { return handle == IntPtr.Zero; }
    }
}

底层句柄是一个 IntPtr 并且由于它在 32 位和 64 位上的大小不同,我认为如果 TAPI 期望在 32 位上只有 4 个字节,这可能会导致问题。为了测试这个理论,我正在考虑创建一个不使用 IntPtr 的句柄。这听起来像一个合理的方法吗?

感谢您的任何建议。

4

2 回答 2

0

我刚刚在 .net 3.5(mscorlib 是 32 位)上遇到了同样的问题,在这种情况下,julmar ATAPI 必须编译为 x86,因为任何 CPU 或 x64 都不是 64 位操作系统的选项。

我没有支持 mscorlib 64 位的 dotnet 4.0,所以我无法进一步调试,我唯一的选择是 x86。

有关信息,TSP 需要是 64 位系统上的 64 位版本。

于 2012-07-13T07:49:35.967 回答
0

“修复来自论坛的 x64 回调。” https://github.com/markjulmar/atapi.net/commit/0b8fd1dcde148e7f57230915028dedebd956c65d

于 2019-02-05T16:53:40.693 回答