猫でもわかるC言語を履修中なのですが、
http://www.kumei.ne.jp/c_lang/intro2/no_114.htm
こちらのページの最下、サンプルプログラムをタグに示した環境でコピー・実行したところ、
l buffer is too small && 0
等のエラーが発生しました。
バッファが少なすぎるとのことなので増やしてみたりと試行錯誤を繰り返したのですが、
lpStr=NULLになったりととても初心者には分かりませんでした。
VisualStudioは最新版を使っており筆者様の環境と違って、セキュリティ的な面で様々な制約が発生しているからではないかと推測するのですが、どうすれば動くようになるのか教えていただけたら幸いです。
稚拙な説明で申し訳ございませんが、何卒よろしくお願いいたします。
◆追記
環境:Microsoft Visual Studio Community 2019 Version 16.7.2
エラーメッセージ:Bull様が提示してくださった通り、
Debug Assertion Failed!
Expression: (L"Buffer is too small" && 0)
と表示されます。
コード:dodox86様、Bull様のおっしゃる通り、
上記のコードを編集し、現在は以下の通りです。
scanf,gets等はscanf_s等、対応するものに書き換えました。
/* filemapping01.c */
#include <stdio.h>
#include <windows.h>
#include <conio.h>
int FRead(LPSTR);
int FWrite(LPSTR);
HANDLE hFMWrite;
int main()
{
static LPSTR lpAddress1, lpAddress2;
int szNo=0;
BOOL bEnd = FALSE;
while (1) {
printf("\n");
printf("1. Writre\n");
printf("2. Read\n");
printf("0. End\n");
printf("\n");
printf("No. = ");
scanf_s("%d",&szNo);
switch (szNo) {
case 1:
FWrite(lpAddress1);
break;
case 2:
FRead(lpAddress2);
break;
case 0:
bEnd = TRUE;
break;
default:
printf("正しくない番号です\n\n");
break;
}
if (bEnd)
break;
}
if (hFMWrite) {
if (CloseHandle(hFMWrite) == 0)
printf("書き込みハンドルクローズ失敗\n");
else
printf("書き込みハンドルクローズ成功\n");
}
return 0;
}
int FWrite(LPSTR lpStr)
{
char szStr[1024];
if (!hFMWrite)
CloseHandle(hFMWrite);
hFMWrite = CreateFileMapping(
(HANDLE)-1,
NULL,
PAGE_READWRITE,
0,
1024,
"NEKODEMOWAKARU");
if (hFMWrite == NULL)
return -1;
if (GetLastError() == ERROR_ALREADY_EXISTS)
printf("すでにマッピングオブジェクトが存在しました\n");
lpStr = (LPSTR)MapViewOfFile(hFMWrite,
FILE_MAP_ALL_ACCESS, 0, 0, 0);
if (lpStr == NULL)
return -2;
printf("書き込み==");
scanf_s(szStr,1024);
strcpy_s(lpStr,1024, szStr);
strcat_s(lpStr,1024, "\n");
UnmapViewOfFile(lpStr);
printf("書き込みました\n");
return 0;
}
int FRead(LPSTR lpStr)
{
HANDLE hFM;
hFM = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, "NEKODEMOWAKARU");
lpStr = (LPSTR)MapViewOfFile(hFM,
FILE_MAP_ALL_ACCESS, 0, 0, 0);
if (lpStr == NULL) {
printf("受信失敗\n");
CloseHandle(hFM);
return -1;
}
printf(lpStr);
if (UnmapViewOfFile(lpStr) == 0) {
printf("読み込み用アドレスアンマップ失敗\n");
}
else {
printf("読み込み用アドレスアンマップ成功\n");
lpStr = NULL;
}
CloseHandle(hFM);
return 0;
}
回答1件
あなたの回答
tips
プレビュー