在DLL类中使用XNA Math

时间:2012-08-04 04:32:54

标签: dll directx xna-math-library

我在我正在创建的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时发生了错误。

2 个答案:

答案 0 :(得分:1)

如果您使用x64本机构建此代码,则此代码是合法的 - 如果您使用__aligned_malloc来确保所有DLLClass实例的内存都是16字节对齐的。 x86(32位)mallocnew默认情况下仅提供8字节对齐。你可以“幸运”#39;但它不稳定。

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

参见 DirectXMath编程指南Getting Started

您有三种选择:

  1. 确保DLLClass始终为16字节对齐
  2. 使用XMFLOAT4XMFLOAT4X4代替并执行显式加载/存储
  3. 使用SimpleMath中的DirectX Tool Kit包装类型来代替您处理装载/存储。

答案 1 :(得分:0)

您不应该使用匿名变量的地址:

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

你需要

XMFLOAT3 foo(0.0f, 0.0f, 0.0f);
vect = XMLoadFloat3(&foo);
相关问题