我有一个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发布功能)。