首页
社区
课程
招聘
[求助]进程通信,共享段,显式调用不能写共享缓冲区
发表于: 2016-8-16 17:49 4912

[求助]进程通信,共享段,显式调用不能写共享缓冲区

2016-8-16 17:49
4912
RT

//         #pragma comment(lib, "../Debug/ShareDll.lib")
//         __declspec(dllimport) char g_szSynch[32];
//         __declspec(dllimport) char g_szBuff[1024];
//         __declspec(dllimport) ULONG        g_uBuffLen;
隐式调用可以写共享缓冲区

        HMODULE hMod = LoadLibrary("../Debug/ShareDll.dll");
        if (hMod)
        {               
                char* g_szSynchW = (char*)GetProcAddress(hMod, "g_szSynch");
                char* g_szBuffW = (char*)GetProcAddress(hMod, "g_szBuff");
                ULONG* g_puBuffLenW = (ULONG*)GetProcAddress(hMod, "g_uBuffLen");
                if (g_szSynchW && g_szBuffW && g_puBuffLenW)
                {
...
显式调用写不了共享缓冲区

附上小例VS2008,求科普!感谢

dll.cpp
#include <windows.h>
//define data segment
#pragma data_seg("ShareDll")
//...
char    g_szBuff[1024] = "Some Shared Global Variable";//share data
char    g_szSynch[32] = "Synchronized Event";//synchronized event name
ULONG        g_uBuffLen = 1023;
//...
#pragma data_seg()
#pragma comment(linker, "/SECTION:ShareDll,RWS")

dll.def
EXPORTS
    g_szSynch
    g_uBuffLen
        g_szBuff

CxxDlg.cpp

void CxxDlg::OnBnClickedButton4()
{
        CString strSend;
        GetDlgItemText(IDC_EDIT1, strSend);
        ULONG uWriteLen = strSend.GetLength();
        if (!uWriteLen)
        {
                return;
        }

        //share dll write
        HMODULE hMod = LoadLibrary("../Debug/ShareDll.dll");
        if (hMod)
        {               
                char* g_szSynchW = (char*)GetProcAddress(hMod, "g_szSynch");
                char* g_szBuffW = (char*)GetProcAddress(hMod, "g_szBuff");
                ULONG* g_puBuffLenW = (ULONG*)GetProcAddress(hMod, "g_uBuffLen");
                if (g_szSynchW && g_szBuffW && g_puBuffLenW)
                {
                        ULONG uBuffLen = *g_puBuffLenW;
                        HANDLE hEvent = ::OpenEvent( EVENT_ALL_ACCESS, FALSE, g_szSynchW );
                        if ( !hEvent )
                        {
                                //create synchronized object
                                hEvent = ::CreateEvent( NULL, FALSE/*auto*/, TRUE/*init*/, g_szSynchW );
                                if ( hEvent )
                                {
                                        WaitForSingleObject( hEvent, INFINITE );                                       
                                        ULONG u = uWriteLen>uBuffLen ? uBuffLen : uWriteLen;
                                        memmove(g_szBuffW, strSend.GetBuffer(0), u);
                                        SetEvent( hEvent );

                                        CloseHandle( hEvent );
                                        hEvent = NULL;
                                }
                        }
                }
                FreeLibrary(hMod);
                hMod = NULL;
        }

//         #pragma comment(lib, "../Debug/ShareDll.lib")
//         __declspec(dllimport) char g_szSynch[32];
//         __declspec(dllimport) char g_szBuff[1024];
//         __declspec(dllimport) ULONG        g_uBuffLen;
//         HANDLE hEvent = ::OpenEvent( EVENT_ALL_ACCESS, FALSE, g_szSynch );
//         if ( !hEvent )
//         {
//                 //create synchronized object
//                 hEvent = ::CreateEvent( NULL, FALSE/*auto*/, TRUE/*init*/, g_szSynch );
//                 if ( hEvent )
//                 {
//                         WaitForSingleObject( hEvent, INFINITE );                                       
//                         ULONG u = uWriteLen>g_uBuffLen ? g_uBuffLen : uWriteLen;
//                         memset(g_szBuff, 0, g_uBuffLen);
//                         memmove(g_szBuff, strSend.GetBuffer(0), u);
//                         SetEvent( hEvent );
//
//                         CloseHandle( hEvent );
//                         hEvent = NULL;
//                 }
//         }
}

MFC工程真特么大....

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 1319
活跃值: (1118)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
用内存映射做
2016-8-16 20:59
0
雪    币: 18
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
//share dll write
  HMODULE hMod = LoadLibrary("../Debug/ShareDll.dll");
  if (hMod)
  {   
   ...
//    FreeLibrary(hMod);
//    hMod = NULL;
  }

原来逻辑有问题,提供共享的进程也给free了....
2016-9-19 18:29
0
游客
登录 | 注册 方可回帖
返回
//