diff --git a/projects/kiwano/kiwano.vcxproj b/projects/kiwano/kiwano.vcxproj
index d78cedd3..eb83575f 100644
--- a/projects/kiwano/kiwano.vcxproj
+++ b/projects/kiwano/kiwano.vcxproj
@@ -166,6 +166,7 @@
+
diff --git a/projects/kiwano/kiwano.vcxproj.filters b/projects/kiwano/kiwano.vcxproj.filters
index 0cc9eff1..e13e15a7 100644
--- a/projects/kiwano/kiwano.vcxproj.filters
+++ b/projects/kiwano/kiwano.vcxproj.filters
@@ -587,6 +587,9 @@
render
+
+ render
+
diff --git a/src/kiwano/render/DirectX/NativePtr.h b/src/kiwano/render/DirectX/NativePtr.h
index 5d2fc309..2e132d68 100644
--- a/src/kiwano/render/DirectX/NativePtr.h
+++ b/src/kiwano/render/DirectX/NativePtr.h
@@ -34,7 +34,7 @@ public:
{
if (object)
{
- ComPtr ptr = object->GetNativePointer>();
+ ComPtr ptr = object->GetNativePointer();
if (ptr)
{
ComPtr<_Ty> native;
@@ -61,7 +61,7 @@ public:
{
if (object)
{
- object->SetNativePointer(com_ptr);
+ object->ResetNativePointer(com_ptr.Get());
}
}
diff --git a/src/kiwano/render/NativeObject.cpp b/src/kiwano/render/NativeObject.cpp
new file mode 100644
index 00000000..fa43030d
--- /dev/null
+++ b/src/kiwano/render/NativeObject.cpp
@@ -0,0 +1,47 @@
+#include "NativeObject.h"
+
+namespace kiwano
+{
+NativeObjectBase::NativeObjectBase()
+ : native_pointer_(nullptr)
+{
+}
+
+bool NativeObjectBase::IsValid() const
+{
+ return native_pointer_ != nullptr;
+}
+
+void NativeObjectBase::ResetNativePointer(void* native_pointer)
+{
+ native_pointer_ = native_pointer;
+}
+
+//
+// NativeObject for Windows
+//
+#if defined(KGE_PLATFORM_WINDOWS)
+
+NativeObject::~NativeObject()
+{
+ ResetNativePointer();
+}
+
+void NativeObject::ResetNativePointer(void* native_pointer)
+{
+ if (native_pointer_)
+ {
+ static_cast(native_pointer_)->Release();
+ native_pointer_ = nullptr;
+ }
+
+ if (native_pointer)
+ {
+ native_pointer_ = native_pointer;
+ static_cast(native_pointer_)->AddRef();
+ }
+}
+
+#endif
+
+}
diff --git a/src/kiwano/render/NativeObject.h b/src/kiwano/render/NativeObject.h
index fc020b23..99627496 100644
--- a/src/kiwano/render/NativeObject.h
+++ b/src/kiwano/render/NativeObject.h
@@ -39,54 +39,55 @@ KGE_DECLARE_SMART_PTR(NativeObject);
* \~chinese
* @brief 含有本机指针的对象
*/
-class KGE_API NativeObject : public ObjectBase
+class KGE_API NativeObjectBase : public ObjectBase
{
public:
- virtual bool IsValid() const;
+ NativeObjectBase();
- Any GetNativePointer() const;
+ bool IsValid() const override;
+
+ void* GetNativePointer() const;
template
- _NativeTy GetNativePointer() const;
+ _NativeTy* GetNativePointer() const;
- void SetNativePointer(const Any& native_pointer);
+ virtual void ResetNativePointer(void* native_pointer = nullptr);
- void ResetNativePointer();
-
-private:
- Any native_pointer_;
+protected:
+ void* native_pointer_;
};
+#if defined(KGE_PLATFORM_WINDOWS)
+
+class KGE_API NativeObject : public NativeObjectBase
+{
+public:
+ virtual ~NativeObject();
+
+ void ResetNativePointer(void* native_pointer = nullptr) override;
+};
+
+#else
+
+typedef NativeObjectBase NativeObject;
+
+#endif
+
/** @} */
-inline bool NativeObject::IsValid() const
-{
- return native_pointer_.HasValue();
-}
-
-inline Any NativeObject::GetNativePointer() const
+inline void* NativeObjectBase::GetNativePointer() const
{
return native_pointer_;
}
template
-inline _NativeTy NativeObject::GetNativePointer() const
+inline _NativeTy* NativeObjectBase::GetNativePointer() const
{
- if (native_pointer_.HasValue())
+ if (native_pointer_ != nullptr)
{
- return native_pointer_.Cast<_NativeTy>();
+ return static_cast<_NativeTy*>(native_pointer_);
}
- return _NativeTy();
-}
-
-inline void NativeObject::SetNativePointer(const Any& native_pointer)
-{
- native_pointer_ = native_pointer;
-}
-
-inline void NativeObject::ResetNativePointer()
-{
- native_pointer_.Clear();
+ return nullptr;
}
} // namespace kiwano