0

我有一个带有以下签名的 c++ 函数

TCHAR *DXGetErrorDescription9(HRESULT hr);

我有

[DllImport("dxerr9.dll",EntryPoint="GetDXErrorString9")]
    static public extern string GetDXErrorString9(int DXError);

如何将字符串编组为 TCHAR*?谢谢

4

1 回答 1

1

经过一番挖掘,结果发现directx 错误例程不是作为dll 提供的,它们是作为静态链接到可执行文件中的库提供的。我应该根据 dxerr9.lib 的大小来计算这一点(它是 5M,比任何其他存根库都大)。

所以为了让它工作,我做了以下工作:

  1. 制作一个包装所有错误处理库函数的“包装器”本机 dll。由于只有 3 个(DXGetErrorDescription、DXGetERrorString 和 DXTrace),这没什么大不了的。
  2. 让 .NET 调用包装函数。

您可以通过创建 Win32 项目在 Visual Studio 中执行此操作(更改应用程序设置,使其成为 dll 并导出符号)。我称分钟为“DirectXErrWrapper”。

在包装器项目中添加 DXGetErrorDescription 的传递。我调用了我的 DXGetErrDescPassThrough():

extern "C" {

DIRECTXERRWRAPPER_API TCHAR * DXGetErrDescPassThrough(HRESULT hr)
{
    return (TCHAR *)DXGetErrorDescription(hr);
}

}

extern "C" 块很重要(与解构 C++ 名称有关)。该项目需要#include "dxerr.h" 并静态链接 dxerr.lib,因此您必须将 directx sdk 包含目录添加到您的包含路径,并将directx sdk lib 目录添加到您的 lib 路径。

然后让您的托管代码从您的包装器 dll 中导入调用:

[DllImport("DirectXErrWrapper.dll", CharSet=CharSet.Unicode)]
static public extern string DXGetErrDescPassThrough(int DXError);

2005 年的原生项目默认使用 unicode,因此 DllImport 需要指定 unicode。最后,通过以下方式从托管代码中调用它:

Debug.WriteLine("DXGettErrDescPassThrough=" + DXGetErrDescPassThrough(0));

在这种情况下,调用将“函数成功完成”打印到调试设备,因为 0 表示成功。

(上一篇文章如下)

这看起来像是 DirectX 函数之一(C++ 不是 C# AFAIK)。我很确定它附带 unicode 和 ansi 版本。在 unicode 上编译时,TCHAR 将映射到 unicode(T 是类型的助记符;unicode 上的 unicode,mbcs 上的多字节字符集,否则为 ansi)。您通常可以使用 CharSet=CharSet.Auto 但如果这会导致兼容性问题(例如,您必须使用 ansi 字符串,因为您已经移植的某些结构需要它)您可以使用与您的项目一致的任何一个(Charset .Unicode 如果您都是 unicode 或 Charset.Ansi),那么将其编组为 C# 字符串应该没有问题。您可能需要将其装饰为 [OUT] 尽管返回值可能是 OUT 隐式。我也希望 DirectX 按照标准 [out, retval] 约定与 TLB 一起发布!
于 2009-03-20T20:25:08.537 回答