C#DllImport返回类型是TCHAR?

时间:2009-03-20 20:17:23

标签: c# interop dllimport

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

TCHAR *DXGetErrorDescription9(HRESULT hr);

我有

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

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

1 个答案:

答案 0 :(得分:1)

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

为了让这个工作,我做了以下事情:

  1. 创建一个包装所有错误处理lib函数的“包装器”本机dll。由于只有3个(DXGetErrorDescription,DXGetERrorString和DXTrace),这不是什么大不了的事。
  2. 让.NET调用包装函数。
  3. 您可以通过创建Win32项目在Visual Studio中执行此操作(更改应用程序设置,使其成为dll,以便导出符号)。我打电话给min“DirectXErrWrapper”。

    在包装器项目中,为DXGetErrorDescription添加一个passthrough。我打电话给我的DXGetErrDescPassThrough():

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

    extern“C”块很重要(与解压缩C ++名称有关)。这个项目需要#include“dxerr.h”并静态链接dxerr.lib,所以你必须将directx sdk include dir添加到你的包含路径,并将directx sdk lib dir添加到你的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的程序!