无法访问 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 标准库中的定义的主要内容,如果未能解决你的问题,请参考以下文章