【问题标题】:CString to void*CString 无效*
【发布时间】:2012-12-24 16:56:07
【问题描述】:

是否可以将CString 转换为void*。我做了一个空指针并将其指向某个对象。现在我把它保存在CString 中。现在我想从CString 转换回void*

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

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

【问题讨论】:

  • 您将void指针的地址作为字符串保存在myString中,并且没有将指针强制转换为CString,因此没有强制返回。
  • @mgr 如果你说的是 %d 那么这是一个打字错误,我用了 %x,我应该用别的吗,
  • @Faisal Hafeez 我只是不明白为什么要将指针的地址存储在字符串中。如果 pPointer 是 CString* 你可以做 CString* myString = (CString*)pPointer,但是如果 pPointer 是别的东西,这将失败。
  • 在我看来,他想将一些指针存储到一个字符串中(作为一个十六进制整数),然后将其解析回来并稍后在代码中使用。
  • 我想保存 SomeObject 的地址并将其保存在一个字符串中,稍后我想从字符串中返回该地址。

标签: c++ windows type-conversion void-pointers cstring


【解决方案1】:

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

void* p = (void*)myString.GetBuffer(1);
...
myString.ReleaseBuffer();

【讨论】:

    【解决方案2】:

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

    // 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;
    }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 出现输入错误,其实我写的是%x,用%x代表void*是否正确,应该用什么,
      • 是的,%x 和 %d 一样,只是数字是十六进制格式。但我仍然不知道你真正想要做什么。
      • 我想保存 SomeObject 的地址并将其保存在一个字符串中,稍后我想从字符串中返回该地址
      • 好的,那么 Mr.C64 的回答向您展示了如何做到这一点。但这似乎仍然很奇怪。也许你真正想做的是序列化?见msdn.microsoft.com/en-us/library/6bz744w8(v=vs.80).aspx
      【解决方案4】:

      这是不可能的。

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

      void* anotherPointer = (void*) & myString;
      

      然后返回:

      CString* pToMyString = (CString*) anotherPointer;
      

      【讨论】:

      • 我会使用 C++ 样式转换。而且,第一个演员表(从CString*void*)是没有用的,所以我只写:void* anotherPointer = &amp;myString;。对于第二个演员,我会使用 static_cast&lt;CString*&gt;: CString* pToMyString = static_cast&lt;CString*&gt;(anotherPointer);
      • @Mr.C64 一开始我不会投给void*,但那是另一回事。
      猜你喜欢
      • 2018-08-28
      • 1970-01-01
      • 2015-05-29
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      • 1970-01-01
      • 2020-06-11
      • 1970-01-01
      相关资源
      最近更新 更多