无法访问 Windows 标准库中的定义

Posted

技术标签:

【中文标题】无法访问 Windows 标准库中的定义【英文标题】:Definitions in windows standard libraries not accessible 【发布时间】:2014-10-18 10:28:00 【问题描述】:

我正在玩网络服务示例。我有传递给各种函数的错误变量。

WS_ERROR* error = NULL;

我想知道这个错误是如何构造的。我在WS_ERROR 上按F12,现在我在WebServices.h 上有定义:

typedef struct _WS_ERROR WS_ERROR; 

嗯,WS_ERROR 是结构 _WS_ERROR。通过在_WS_ERROR 上按F12 深入到_WS_ERROR 并停止!我无法深入了解_WS_ERROR 的定义。为什么?那么,_WS_ERROR 是如何定义的呢?

【问题讨论】:

我不认为你可以看到里面。 MSDN 说“用于引用错误对象的不透明类型。” msdn.microsoft.com/en-us/library/windows/desktop/… 它是一个不透明类型,你不应该知道它长什么样。它带有“丰富的错误”,这是一种在函数失败时更多地了解究竟出了什么问题的方法。您必须使用 WsCreateError() 创建错误对象。并在使用 WsGetErrorString() 调用失败后对其进行查询。之后您可能会使用 WsResetError() 再次清除它,以便下次调用时可用。 【参考方案1】:

因为它是一个opaque type,即程序员不希望你把鼻子放进去的东西(无论出于何种原因)。

一个伪代码示例:假设一家公司有一个库,他们希望您通过公共 API 使用,但不希望您知道他们如何处理幕后事务,他们只会给您一个库文件和一个头文件来链接它,例如

头文件.h

// Public header to link against something
#pragma once

typedef struct FakeStruct* FakeStructPtr; // Opaque type

DLL_PUBLIC void public_api_function(FakeStructPtr obj);

您将按照 API 参考中的说明使用 FakeStructPtr,并将您的 FakeStruct 对象(由其他 API 函数创建)传递给某些 public_api_function

公司内部可能会做类似的事情

// Internals
#include "Header.h"

struct RealDataType 
    int realdata1;
    float realdata2;
    // whatever..
;

void public_api_function(FakeStructPtr obj) 
    RealDataType* ptr = reinterpret_cast<RealDataType*>(obj); // Cast to real data
    // use the real data through RealDataType..

并确保您最终不会查看他们的内部数据类型(除非您使用了一些逆向操作或有人公开了错误的调试版本)。

【讨论】:

以上是关于无法访问 Windows 标准库中的定义的主要内容,如果未能解决你的问题,请参考以下文章

无法从类库访问 appsettings.json

Symfony |如何从控制器中的存储库访问自定义方法?

windows7无法访问windows server2019共享文件夹

win10新增用户其他用户无法访问原用户资料?

怎样解决windows无法访问指定设备路径或文件?

无法访问joomla 3.9.3中的用户对象