WinAPI线程无法写入内存映射文件

WinAPI线程无法写入内存映射文件,winapi,Winapi,我试图创建两个线程,一个写入映射内存位置,另一个从该位置读取。 到目前为止,我已经成功地创建了线程及其附带的函数,但我的主要问题是,当第一个进程要写入映射文件时,我抛出了错误值6,这意味着无效的\u句柄\u异常,但我不明白为什么它会这样做,因为我已经制作了另一个程序,可以以同样的方式写入映射位置。这是我的代码,在write\u in\u mapped函数中抛出错误: #include <iostream> #include <string> #include <Wi

我试图创建两个线程,一个写入映射内存位置,另一个从该位置读取。
到目前为止,我已经成功地创建了线程及其附带的函数,但我的主要问题是,当第一个进程要写入映射文件时,我抛出了错误值6,这意味着
无效的\u句柄\u异常
,但我不明白为什么它会这样做,因为我已经制作了另一个程序,可以以同样的方式写入映射位置。这是我的代码,在
write\u in\u mapped
函数中抛出错误:

#include <iostream>
#include <string>
#include <Windows.h>

using namespace std;

HANDLE hMutex = CreateMutex(NULL, false, NULL);

int write_in_mapped(HANDLE memoryFile) {
    cout << memoryFile << endl;

    WaitForSingleObject(hMutex, INFINITE);

    string message = "";

    for (int i = 0; i < 200; i++) {
    int a = rand() % 10000;
    int b = a * 2;

    message.append(to_string(a)).append(",").append(to_string(b)).append(";");
}

HANDLE mapFile = MapViewOfFile(memoryFile, FILE_MAP_ALL_ACCESS, 0, 0, 1024);
if (mapFile == INVALID_HANDLE_VALUE) {
    cout << "Unable to map shared memory 1 - error value:" << GetLastError() << endl;
    CloseHandle(memoryFile);
    system("pause");
    return FALSE;
}

if (size(message)) {
    cout << message << endl;
    CopyMemory(mapFile, message.c_str(), strlen(message.c_str()) * sizeof(TCHAR));
    cout << "Succesfully loaded numbers!" << endl;
}
else {
    cout << "Couldn't create numbers!" << endl;
    CloseHandle(mapFile);
    CloseHandle(memoryFile);
    return FALSE;
}

    ReleaseMutex(hMutex);

    cout << "Done write_to_mapped" << endl;

    return 0;
}


int read_from_mapped(TCHAR name[]) {

cout << name << endl;

WaitForSingleObject(hMutex, INFINITE);

HANDLE openFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, name);
if (openFile == INVALID_HANDLE_VALUE) {
    cout << "Error at opening mapped memory 2 - error value:" << GetLastError() << endl;
    system("pause");
    return FALSE;
}

LPTSTR mapFile = (LPTSTR)MapViewOfFile(openFile, FILE_MAP_ALL_ACCESS, 0, 0, 1024);
if (mapFile == NULL) {
    cout << "Error at mapping memory 3 file - error value:" << GetLastError() << endl;
    CloseHandle(openFile);
    system("pause");
    return FALSE;
}

    string result = string(mapFile).c_str();

    cout << result << endl;

    ReleaseMutex(hMutex);

    return 0;
}

int main() {

    HANDLE process_1, process_2, memoryFile;
    TCHAR name[] = TEXT("Global\\MyFileMappingObject");

    memoryFile = CreateFileMapping(0, 0, PAGE_READWRITE, 0, 1024, name);

    if (memoryFile == INVALID_HANDLE_VALUE) {
        cout << "Error at opening mapped memory area - " << GetLastError() << endl;

    system("pause");
    return FALSE;
}

    process_1 = CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)write_in_mapped, &memoryFile, NULL, NULL);
    WaitForSingleObject(process_1, INFINITE);

    process_2 = CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)read_from_mapped, &name, NULL, NULL);
    WaitForSingleObject(process_2, INFINITE);

   CloseHandle(memoryFile);
   CloseHandle(hMutex);

   system("pause");
   return 0;
}
#包括
#包括
#包括
使用名称空间std;
HANDLE hMutex=CreateMutex(NULL、false、NULL);
int write_in_mapped(句柄内存文件){

你的代码包含了难以置信的错误。所有代码都是一个大错误。
CreateFileMapping
OpenFileMapping
在出错时返回0,但不
无效的句柄值
记忆文件
名称
作为
创建线程
?!?的参数,当需要
记忆文件
名称
时,无

您可以调用
CloseHandle(memoryFile);
int write\u-in\u-mapped(HANDLE-memoryFile)
int main()
-因此尝试两次关闭memoryFile,但是您在
write\u-in\u-mapped
中得到了无效的句柄,因为使用了
memoryFile
,所以在
CloseHandle
中得到了
无效的句柄\u异常
HANDLE-mapFile=MapViewOfFile
-这是什么?!?以此类推


噩梦

您的代码包含了数量惊人的错误。所有代码都是一个大错误。
CreateFileMapping
OpenFileMapping
在出错时返回0,但不
无效的句柄值
记忆文件
名称
作为
创建线程
?!?的参数,当需要
记忆文件
名称
时,无

您可以调用
CloseHandle(memoryFile);
int write\u-in\u-mapped(HANDLE-memoryFile)
int main()
-因此尝试两次关闭memoryFile,但是您在
write\u-in\u-mapped
中得到了无效的句柄,因为使用了
memoryFile
,所以在
CloseHandle
中得到了
无效的句柄\u异常
HANDLE-mapFile=MapViewOfFile
-这是什么?!?以此类推


噩梦

谢谢你,实际上你对
线程
参数的理解是正确的,但是下次会让你的答案更容易理解。谢谢你,实际上你对
线程
参数的理解是正确的,但是下次会让你的答案更容易理解。除了这些错误之外答案中还有更多:如果在调用
CreateThread
时需要对线程例程进行强制转换,则使用了错误的函数签名。在这种情况下,您传递了错误的参数,并且缺少调用约定。一个更微妙的错误是,您正在调用
GetLastError()
太晚了。您需要在达到条件后立即调用它,该条件返回一个有意义的值。您是在写入STDOUT后调用它的(这可能会设置线程的最后一个错误值)。除了答案中列出的错误外,还有更多错误:如果在调用
CreateThread
时需要对线程例程进行强制转换,则使用了错误的函数签名。在这种情况下,您传递了错误的参数,并且缺少调用约定。更微妙的错误是,您正在调用
GetLastError()
太晚了。您需要在达到条件后立即调用它,该条件返回一个有意义的值。您是在写入STDOUT后调用它的(这可能会设置线程的最后一个错误值)。