none
GlobalAlloc开的全局区域怎样访问? RRS feed

  • 问题

  • 我在.h文件中定义一个结构体:

    typedef struct

    {

    CString str;

    }M, *pM;

     

    .cpp文件中的按钮响应函数中:

    pM m_pm;

    m_pm = (pM)GlobalAlloc(GPTR, sizeof(M));

    m_pm->str = “hello”;这样赋值就出错,提示为: Unhandled exception at 0x5581b49e (mfc100ud.dll) in test.exe: 0xC0000005: Access violation reading location 0xfffffffc.

     

    :应该怎样赋值?


    xiao
    2011年2月7日 9:23

答案

  • 你可以在全局的地方创建这个对象。其他文件用extern 引用。或者使用Singlton模式。
    麻烦把正确答案设为解答。
    • 已标记为答案 wh_xiao 2011年2月10日 10:45
    2011年2月10日 7:34
    版主

全部回复

  • GlobalLock

    新的程序应该用HeapAlloc,GlobalAlloc在32位Windows上不过是HeapAlloc的一个封装



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2011年2月8日 5:20
    版主
  • 你可能GlobalLock,GlobalUnlock没有用上

    参考下http://pleasureworking.blog.163.com/blog/static/25719635200941225890/

    的用法

    如果是你vc版本比较高的话 m_pm->str = _T("hello");

    2011年2月8日 13:22
  • 我觉得问题是GlobalAlloc只是分配内存了。并没有进行初始化。所以str还不存在


    麻烦把正确答案设为解答。
    2011年2月9日 2:54
    版主
  • 1.根据http://blogs.msdn.com/b/oldnewthing/archive/2004/11/09/254441.aspx HGLOBAL句柄就是内存的地址。虽然对于这个问题楼主肯定是一知半解,只是碰巧对了。

    2.出错是因为CString是c++类,GlobalAlloc只分配了内存没有调用CString的构造函数。

    所以这样:

    m_pm = (pM)GlobalAlloc(GPTR, sizeof(M));

    new(&(m_pm->str)) CString;

    m_pm->str = “hello”;

    2011年2月9日 4:24
  • 我看到一个网络程序是这样用的:

    先定义一个结构体:

    typedef struct

    {

    OVERLAPPED Overlapped;

    WSABUF DataBuf;

    CHAR Buffer[DATA_BUFSIZE];

    DWORD BytesSEND;

    DWORD BytesRECV;

    }PER_IO_OPERATION_DATA, *LPPER_IO_OPERATION_DATA;

     在一个cpp文件中直接定义LPPER_IO_OPERATION_DATA的指针:

    LPPER_IO_OPERATION_DATA PerIoData;

    后就开一全局内存:

     if ((PerIoData = (LPPER_IO_OPERATION_DATA) GlobalAlloc(GPTR, sizeof(PER_IO_OPERATION_DATA))) == NULL)

    {

     printf("GlobalAlloc() failed with error %d\n", GetLastError()); return;

    }

    之后就是使用:

    ZeroMemory(&(PerIoData->Overlapped), sizeof(OVERLAPPED));

     PerIoData->BytesSEND = 0;

    PerIoData->BytesRECV = 0;

     PerIoData->DataBuf.len = DATA_BUFSIZE;

    PerIoData->DataBuf.buf = PerIoData->Buffer;

     

     Flags = 0;

    if (WSARecv(Accept, &(PerIoData->DataBuf), 1, &RecvBytes, &Flags, &(PerIoData->Overlapped), NULL) == SOCKET_ERROR)

    {

     if (WSAGetLastError() != ERROR_IO_PENDING)

    {

    printf("WSARecv() failed with error %d\n", WSAGetLastError()); return;

    }

    }

    这里没有初始化,也没有报错.

    • 已编辑 wh_xiao 2011年2月9日 8:00
    2011年2月9日 7:43
  • 这种页面不能布局,郁闷。
    xiao
    2011年2月9日 7:56
  • A POD-struct is an aggregate class that has no non-static data members of type pointer to member, non-POD-struct, non-POD-union (or array of such types) or reference, and has no user-defined copy assignment operator and no user-defined destructor.

    哪我要怎样才能用?


    xiao
    2011年2月10日 4:59
  • 你可以在全局的地方创建这个对象。其他文件用extern 引用。或者使用Singlton模式。
    麻烦把正确答案设为解答。
    • 已标记为答案 wh_xiao 2011年2月10日 10:45
    2011年2月10日 7:34
    版主