代码之家  ›  专栏  ›  技术社区  ›  user3746571

IOCreatePlugInInterfaceForService返回神秘错误

  •  6
  • user3746571  · 技术社区  · 7 年前

    我正在尝试在新的Swift 4.0 Mac应用程序(不是iOS)中使用一些旧的IOKit功能。我已经创建了一个桥接头来使用现有的Objective C第三方框架DDHidLib,我目前正在使用Xcode 9。

    试图为usb游戏板创建插件接口的代码位于IOCreatePlugInInterfaceForService上,返回非零错误。

    真正奇怪的是,我有一个旧版本的Xcode应用程序,它使用相同的框架,在新的Xcode 9中打开后可以正常工作。之前的这个项目仍然是Swift,为同一个Obj-C框架使用桥接头。我已经检查了构建设置,并试图使所有内容都匹配,但我得到了相同的结果;旧应用程序可以正常工作,但任何新应用程序都无法正常工作。

    有没有一种方法可以:找出构建设置/编译器中的确切差异以查看难以捉摸的差异,或者进入IOCreatePlugInInterfaceForService IOKit方法以查看是什么导致错误在一个项目中返回,而不是在另一个项目中返回?

    编辑:以下是失败的方法:

    - (BOOL) createDeviceInterfaceWithError: (NSError **) error_; {
    io_name_t className;
    IOCFPlugInInterface ** plugInInterface = NULL;
    SInt32 score = 0;
    NSError * error = nil;
    BOOL result = NO;
    
    mDeviceInterface = NULL;
    
    NSXReturnError(IOObjectGetClass(mHidDevice, className));
    if (error)
        goto done;
    
    NSXReturnError(IOCreatePlugInInterfaceForService(mHidDevice, kIOHIDDeviceUserClientTypeID,kIOCFPlugInInterfaceID,&plugInInterface,&score));
    if (error)
        goto done;
    
    //Call a method of the intermediate plug-in to create the device interface
    NSXReturnError((*plugInInterface)->QueryInterface(plugInInterface, CFUUIDGetUUIDBytes(kIOHIDDeviceInterfaceID), (LPVOID) &mDeviceInterface));
    if (error)
        goto done;
    
    result = YES;
    
    done:
        if (plugInInterface != NULL)
        {
            (*plugInInterface)->Release(plugInInterface);
        }
        if (error_)
            *error_ = error;
        return result;
    }
    

    在有效的旧版本中,IOCreatePlugInInterfaceForService始终返回值0。在所有不工作的版本中,返回值似乎总是-536870210。此函数中的mHidDevice是设备的io\U object\t句柄。

    编辑2:这是设备的IORegistryExplorer页面

    Here is the IORegistryExplorer page for the device

    3 回复  |  直到 7 年前
        1
  •  9
  •   user3746571    7 年前

    经过数周的努力,终于解决了这个问题。新的Xcode 9使用应用程序沙盒,基本上防止在新应用程序中默认访问USB、蓝牙、摄像头和麦克风等。一旦我关掉它,它就会恢复到预期的状态。

    很高兴最终得到了如此简单的答案,但令人失望的是,Xcode没有提供更多描述性错误消息或响应,让用户知道他们实际上是在阻止自己访问所需的系统部分。

        2
  •  0
  •   pmdj    7 年前

    看起来像 kIOReturnNoResources 如果循环在 IOCreatePlugInInterfaceForService 使用完成 haveOne == false 不管什么原因。可能 Start() 是否因为另一个进程或驱动程序已经具有独占访问权限而返回false?我会在IORegistryExplorer中检查设备有哪些客户端。

        3
  •  0
  •   Dmitry Mikushin    4 年前

    当应用程序试图访问MacOS 10.14及更高版本上的摄像头或蓝牙时,也会发生此错误。权限应由用户明确授予(弹出窗口),或通过安全和;隐私应用程序应检查权限,如图所示 here .