我有一个带有以下签名的c ++函数
TCHAR *DXGetErrorDescription9(HRESULT hr);
我有
[DllImport("dxerr9.dll",EntryPoint="GetDXErrorString9")]
static public extern string GetDXErrorString9(int DXError);
如何将字符串编组到TCHAR *?感谢
答案 0 :(得分:1)
经过一番挖掘后,发现directx错误例程不是作为dll发布的,它们作为libs发送,你静态链接到你的可执行文件中。我应该根据dxerr9.lib的大小来计算它(它是5M,大于任何其他存根库)。
为了让这个工作,我做了以下事情:
您可以通过创建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的程序!