如何从Windows服务应用程序中读取32位第三方应用程序的内存映射文件数据?

时间:2018-02-07 09:13:34

标签: c# visual-c++ windows-services memory-mapped-files

我有一个32位的第三方应用程序的DLL。它是类型库项目,并创建一个名为 MappedObject 的内存映射文件。这是指示生成mmf文件的代码段: -

#include "stdafx.h"
#include "dllmain.h"
#include <stdio.h>
#include <tchar.h>

#include <ctime>


#pragma comment(lib, "user32.lib")

#define BUF_SIZE 48

HANDLE hMapFile;
LPCTSTR memoryBuf;
TCHAR szName[] = TEXT("MappedObject");
/**
 */
BOOL APIENTRY DllMain(HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        {
        hMapFile = CreateFileMapping(hMapFile, NULL, PAGE_READWRITE, 0, BUF_SIZE, szName);

        if (hMapFile == NULL)
        {
            _tprintf(TEXT("Could not create file mapping object (%d).\n"),
                GetLastError());
            return FALSE;
        }
        memoryBuf = (LPTSTR)MapViewOfFile(hMapFile,   // handle to map object
            FILE_MAP_WRITE, // read/write permission
            0,
            0,
            BUF_SIZE);

        if (memoryBuf == NULL)
        {
            _tprintf(TEXT("Could not map view of file (%d).\n"),
                GetLastError());

            CloseHandle(hMapFile);

            return FALSE;
        }
        }
        break;

现在有一个第二个C#应用程序必须读取此内存映射文件。 C#应用程序是Windows服务类型。这是一段代码: -

 try
            {
                MemoryMappedFile mmf = MemoryMappedFile.OpenExisting(@"Global\MappedObject", MemoryMappedFileRights.ReadWrite, HandleInheritability.None);
                Library.WriteErrorLog("Mapped File Accessed");
                MemoryMappedViewAccessor mmfViewStream = mmf.CreateViewAccessor(0, MMF_MAX_SIZE, MemoryMappedFileAccess.Read);
                byte[] buffer = new byte[MMF_MAX_SIZE];
                String message = String.Empty;
                while (mmfViewStream.CanRead)
                {
                    mmfViewStream.ReadArray(0, buffer, 0, MMF_MAX_SIZE);
}

每当第二个应用程序即c#应用程序尝试访问内存映射文件时。它找不到它。 真正奇怪的是,如果我构建一个简单的控制台应用程序并尝试访问内存映射文件,我可以。但是,Windows服务类型应用程序中似乎存在问题。任何人都可以指向我正确的方向吗?

为了您的信息,映射的文件名是MappedObject,我试图通过我的服务应用程序中的MappedObject,@“Global \ Mapped”访问它。但是,它似乎不起作用。我在Windows 10 64bit上。第三方应用程序是32位。服务应用程序也是32位(我正在使用构建的visual studio的x86发布功能)。

0 个答案:

没有答案