0

我在创建的 DLL 中使用 XNA Math 时遇到问题。我有一个在 DLL 中的类,将被导出。它有一个 XMVECTOR 类型的成员变量。在类构造函数中,我尝试初始化 XMVECTOR。我从读取位置 0x0000000000 读取时遇到访问冲突

代码运行如下:

class DLLClass 
{
public:
    DLLClass(void);
    ~DLLClass(void);
protected:
    XMVECTOR vect;
    XMMATRIX matr;
}

DLLClass::DLLClass(void)
{
    vect = XMLoadFloat3(&XMFLOAT3(0.0f, 0.0f, 0.0f));    //this is the line causing the access violation
}

请注意,此类位于将要导出的 DLL 中。我不知道这是否会通过一些进一步的信息有所作为。

另外,当我这样做时,我还有一个问题:

我也收到警告:struct '_XMMATRIX' 需要有 dll-interface 供类 'DLLClass' 的客户端使用

这是致命的吗?如果不是,这是什么意思,我该如何摆脱它?请注意,此 DLLClass 将被导出,并且 DLLClass 的“客户端”可能会使用变量“matr”。

任何帮助,将不胜感激。

编辑:只是一些进一步的信息:我已经逐行调试了代码,似乎在将 XMLoadFloat3 的返回值分配给 vect 时发生了错误。

4

2 回答 2

1

仅当您使用 x64 本机构建时,此代码才是合法的 - 或者 - 如果您用于__aligned_malloc确保 DLLClass 的所有实例的内存都是 16 字节对齐的。x86(32 位)malloc并且new默认仅提供 8 字节对齐。你可以“走运”,但它并不稳定。

class DLLClass 
{
public:
   DLLClass(void);
   ~DLLClass(void);
protected:
   XMVECTOR vect;
   XMMATRIX matr;
}

请参阅DirectXMath 编程指南入门

你有三个选择:

  1. 确保 DLLClass 始终是 16 字节对齐的
  2. 使用XMFLOAT4andXMFLOAT4X4代替并执行显式加载/存储
  3. 使用DirectX Tool Kit中的SimpleMath包装器类型来代替为您处理加载/存储。
于 2015-06-04T01:50:12.413 回答
0

您不应该获取匿名变量的地址:

vect = XMLoadFloat3(&XMFLOAT3(0.0f, 0.0f, 0.0f));

你需要

XMFLOAT3 foo(0.0f, 0.0f, 0.0f);
vect = XMLoadFloat3(&foo);
于 2012-08-04T04:36:41.127 回答