0

に変換することは可能ですCStringvoid*。void ポインターを作成し、それを何らかのオブジェクトに向けました。今、私はこれをに保存しましたCStringvoid*今、私は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を aに「変換」することはできませんが、 a (つまり、 aへのポインター) を aに「変換」することはできます。CStringvoid*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 に答える