0

Is it possible to convert CString to void*. I made a void pointer and pointed it to some object. Now I saved this in a CString. Now I want to convert back to void* from CString.

void* pPointer = &SomeObject;
CString myString;
myString.Format(_T("%x"), pPointer);

//void* anotherPointer = (void*)myString;
4

4 回答 4

3

这是不可能的。

您可以做的是转换CString*void*

void* anotherPointer = (void*) & myString;

然后回来 :

CString* pToMyString = (CString*) anotherPointer;
于 2013-01-10T10:47:08.490 回答
2

您不能将a “转换”CString为 a void*,但您可以将a (即指向 a 的指针“转换”为 a :CString*CStringvoid*

// Create a CString object
CString str(_T("Foo"));

// Store CString address in a void* pointer
void* ptr = &str;

// Cast from void* back to CString*
CString* pstr = static_cast<CString*>(ptr);

// Print CString content
_tprintf(_T("%s\n"), pstr->GetString());

但是,您似乎在做一些不同的事情:即将某个对象的地址(指针)作为整数格式的字符串存储到CString. 然后你需要从字符串中取回整数值,使用一些解析函数,比如_tcstoul(). 这似乎有效,但需要更多测试:

#include <stdlib.h>

#include <iostream>
#include <ostream>
#include <string>

#include <atlbase.h>
#include <atldef.h>
#include <atlstr.h>

using namespace std;
using namespace ATL;


// Some test class
struct MyClass
{
    string Foo;
    int Bar; 

    MyClass(const string& foo, int bar)
       : Foo(foo), Bar(bar)
    {}
};


// Test
int main()
{
    // Create some object
    MyClass c("A foo", 10);

    // Get the address of the object
    void* ptr = &c;

    // Format the address into a string
    CString str;
    str.Format(_T("%p"), ptr);

    // Parse the address from string
    void* ptr2 = reinterpret_cast<void*>( _tcstoul( str.GetString(), nullptr, 16 ) );

    // Get back the original MyClass pointer
    MyClass* pMyClass = static_cast<MyClass*>(ptr2);

    // Check result
    cout << pMyClass->Foo << endl;
    cout << pMyClass->Bar << endl;
}
于 2013-01-10T11:00:54.817 回答
0

您格式化字符串的方式似乎是错误的。%d用于整数,因此它将导致void*地址被格式化为数字。如果这确实是您想要的,您可以解析字符串以获取它包含的数字,然后将其转换为void*。但我很确定这不是你想要的。

于 2013-01-10T10:48:40.437 回答
0

如果打算使用 CString 的内容(即写入文件),则需要使用 GetBuffer 函数来访问实际内容。

void* p = (void*)myString.GetBuffer(1);
...
myString.ReleaseBuffer();
于 2018-03-28T23:41:45.620 回答