前提・実現したいこと
C言語でWindowsAPIを使用し、メールスロットからメッセージを読み書きするプログラムを作成しています。
(メールスロットの実装方法が知りたいため、スレッドやプロセスは分けておりません)
メールスロットを作り、"Hello World!"を書き込んだ後、メールスロットからバッファに文字列を読み込み、
コンソールに出力させたいのですが、ReadFile関数実行時に、87エラー(パラメータが間違い)が出ています。
ReadFile関数のどのパラメータが間違っているのでしょうか。
以下、ソースコードです。
該当のソースコード
C
1#include <stdio.h> 2#include <Windows.h> 3#include <tchar.h> 4 5LPCTSTR slotName = TEXT("\\.\mailslot\sanple_mailslot"); 6 7int main() { 8 9 DWORD maxnum = 256; //メールスロット最大読み込み値 10 DWORD error = 0; 11 12 //メールスロットの作成 13 HANDLE handle1 = CreateMailslot( 14 slotName, 15 maxnum, 16 MAILSLOT_WAIT_FOREVER, 17 NULL 18 ); 19 20 if (handle1 == INVALID_HANDLE_VALUE) { 21 printf_s("CreateMailslotに失敗しました\n"); 22 return 1; 23 } 24 25 //メールスロットに書き込むメッセージを作成 26 LPCTSTR str1 = TEXT("Hello World!"); 27 //メールスロットに書き込んだバイト数 28 DWORD writedbyte = 0; 29 30 //メールスロットを書き込み権限でオープンする 31 HANDLE handle2 = CreateFile( 32 slotName, 33 GENERIC_WRITE, 34 FILE_SHARE_READ, 35 NULL, 36 OPEN_EXISTING, 37 FILE_ATTRIBUTE_NORMAL, 38 NULL 39 ); 40 41 if (handle2 == INVALID_HANDLE_VALUE) { 42 printf_s("メールスロットのオープンに失敗しました\n"); 43 error = GetLastError(); 44 printf_s("エラーコードは%dです\n",error); 45 return 1; 46 } 47 48 //メールスロットに書き込みする 49 bool writeResult = WriteFile( 50 handle2, 51 str1, 52 sizeof(str1), 53 &writedbyte, 54 NULL 55 ); 56 57 if (!writeResult) { 58 printf_s("メールスロットへの書き込みに失敗しました\n"); 59 error = GetLastError(); 60 printf_s("エラーコードは%dです\n"); 61 return 1; 62 } 63 64 CloseHandle(handle2); 65 66 //メールスロットを読み込みモードでオープンする 67 HANDLE handle3 = CreateFile( 68 slotName, 69 GENERIC_READ, 70 FILE_SHARE_DELETE, 71 NULL, 72 OPEN_EXISTING, 73 FILE_ATTRIBUTE_NORMAL, 74 NULL 75 ); 76 77 //次のメッセージサイズ 78 DWORD nextMsgByte = 0; 79 //メールスロット内の総メッセージ数 80 DWORD allMsgNum = 0; 81 82 //メールスロットにメッセージがあるか確認する 83 bool getInfoResult = GetMailslotInfo( 84 handle3, 85 &maxnum, 86 &nextMsgByte, 87 &allMsgNum, 88 NULL 89 ); 90 91 if (getInfoResult == false) { 92 printf_s("GetMailslotInfoに失敗しました\n"); 93 error = GetLastError(); 94 printf_s("エラーコードは%dです\n"); 95 return 1; 96 } 97 98 //次のメッセージバイト数、総メッセージ数を確認 99 printf_s("次のメッセージバイト数は%d,総メッセージ数は%dです\n", nextMsgByte, allMsgNum); 100 101 if (allMsgNum == 0) { 102 printf_s("メッセージが書き込まれていません\n"); 103 return 1; 104 } 105 106 //メールスロットから読みだしたバイト数 107 DWORD readByte = 0; 108 //メールスロットから読み込むバッファを確保する 109 LPTSTR readBuf; 110 readBuf = (LPTSTR)malloc(256); 111 if (readBuf == NULL) { 112 memset(readBuf, '\0', 256); 113 } 114 115 //メールスロットのファイルポインタをファイルの先頭に移動 116 DWORD fp = SetFilePointer( 117 handle3, 118 NULL, 119 NULL, 120 FILE_BEGIN); 121 122 printf_s("ファイルポインタの位置は%dです\n",fp); 123 124 125 //メールスロットのメッセージを読み込む 126 bool readResult = ReadFile( 127 handle3, 128 readBuf, 129 nextMsgByte, 130 &readByte, 131 NULL 132 ); 133 134 if (readResult == false) { 135 printf_s("ReadFileに失敗しました\n"); 136 error = GetLastError(); 137 printf_s("エラーコードは%dです\n", error); 138 return 1; 139 } 140 141 //メールスロットから受信したメッセージを出力する 142 _tprintf_s(TEXT("メッセージは「%s」です\n"), str1); 143 144 CloseHandle(handle3); 145 CloseHandle(handle1); 146 return 0; 147 148}
###コンソールに出力された内容
次のメッセージバイト数は4,総メッセージ数は1です
ファイルポインタの位置は0です
ReadFileに失敗しました
エラーコードは87です
試したこと
メールスロットからReadFileするときに87エラーが出るときは、
①CreateFile関数でFILE_FLAG_OVERLAPPEDで開いたときは、OVERLAPPED構造体へのポインタが必要
②ファイルポインタが終端まで来ている
などの場合があるようですが、どちらも原因ではなさそうです。
補足情報(FW/ツールのバージョンなど)
開発環境は、VisualStudio2019です。
初心者でわからない点たくさんあるのですが、ご指摘いただければありがたいです。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー