【问题标题】:Definitions in windows standard libraries not accessible无法访问 Windows 标准库中的定义
【发布时间】: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() 再次清除它,以便下次调用时可用。

标签: c++ winapi visual-c++


【解决方案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..
}

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

【讨论】:

    猜你喜欢
    • 2017-08-02
    • 1970-01-01
    • 2012-09-22
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    • 2019-04-05
    • 2011-03-16
    • 1970-01-01
    相关资源
    最近更新 更多