首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不使用IntPtr的SafeHandle

不使用IntPtr的SafeHandle
EN

Stack Overflow用户
提问于 2011-10-11 17:26:51
回答 2查看 1.1K关注 0票数 2

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

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

代码语言:javascript
复制
rc = NativeMethods.lineGetCallStatus(_hCall, pLcs);

异常详细信息的第一行:

代码语言:javascript
复制
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中的本机函数的以下调用:

代码语言:javascript
复制
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派生的,在库中定义如下:

代码语言:javascript
复制
[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位上的大小不同,我认为如果32位上只需要4个字节,这可能会造成问题。为了测试这个理论,我正在考虑创建一个不使用IntPtr的句柄。这听起来像是一种合理的方法吗?

谢谢你的建议。

EN

回答 2

Stack Overflow用户

发布于 2012-07-13 15:49:36

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

我没有支持64位的dotnet4.0,所以我不能再调试了,我唯一的选择就是x86。

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

票数 0
EN

Stack Overflow用户

发布于 2019-02-06 00:53:41

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7723896

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档