Skip to content

Instantly share code, notes, and snippets.

@meklarian
Created October 28, 2009 02:08
Show Gist options
  • Save meklarian/220174 to your computer and use it in GitHub Desktop.
Save meklarian/220174 to your computer and use it in GitHub Desktop.
Src for a win32 console program that demonstrates cross-thread shared file access.
// InProcessThreadShareTest.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <windows.h>
void EmitError(DWORD dwErr)
{
if(dwErr != 0)
{
LPVOID tszBuf = 0;
DWORD dwFmt = FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
0, dwErr, 0, (LPTSTR)(&tszBuf), 0, 0);
_tprintf(_T("Message:\r\n--\r\n%s\t\n"), (LPTSTR)tszBuf);
if(tszBuf){::LocalFree(&tszBuf);}
}
}
DWORD WINAPI OtherThreadProc(LPVOID arg)
{
_tprintf(_T("** Begin Other Thread\r\n"));
HANDLE hFile = ::CreateFile(_T("C:\\data\\tmp\\sharetest.txt"),
(GENERIC_READ | GENERIC_WRITE),
(FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE),
0, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE,
0);
DWORD dwErr = GetLastError();
_tprintf(_T("File Handle: %8.8x\r\n"), (ULONG)hFile);
_tprintf(_T("Last Error: %8.8x\r\n"), dwErr);
if(dwErr != 0)
{
EmitError(dwErr);
}
else
{
DWORD dwIn = 0;
DWORD dwData = 0;
_tprintf(_T("Old Data: %8.8x\r\n"), dwData);
::ReadFile(hFile, &dwData, sizeof(DWORD), &dwIn, 0);
_tprintf(_T("New Data: %8.8x\r\n%d bytes read.\r\n"), dwData, dwIn);
DWORD dwPos = sizeof(DWORD);
DWORD dwOut = 0;
dwData = 0xF0F0F0F0;
::SetFilePointer(hFile, dwPos, 0, FILE_BEGIN);
::WriteFile(hFile, &dwData, sizeof(DWORD), &dwOut, 0);
::FlushFileBuffers(hFile);
_tprintf(_T("Wrote New Data: %8.8x @ 0x%8.8x\r\n"), dwData, dwPos);
_tprintf(_T("New Size: %d bytes\r\n"), GetFileSize(hFile, NULL));
}
Sleep(4000);
::CloseHandle(hFile);
_tprintf(_T("** End Other Thread\r\n"));
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
_tprintf(_T("** Begin Main Thread\r\n"));
_tprintf(_T("Creating File\r\n"));
HANDLE hFile = ::CreateFile(_T("C:\\data\\tmp\\sharetest.txt"),
(GENERIC_READ | GENERIC_WRITE),
(FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE),
0, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE,
0);
DWORD dwErr = GetLastError();
if(dwErr != 0)
{
EmitError(dwErr);
_tprintf(_T("** Exit Main Thread\r\n"));
Sleep(20000);
return 1;
}
DWORD dwData = 0x12345678;
DWORD dwOut = 0;
::WriteFile(hFile, &dwData, sizeof(DWORD), &dwOut, 0);
_tprintf(_T("Wrote New Data: %8.8x (%d bytes)\r\n"), dwData, dwOut);
::FlushFileBuffers(hFile);
_tprintf(_T("New Size: %d bytes\r\n"), GetFileSize(hFile, NULL));
DWORD threadID = 0;
HANDLE hThread = ::CreateThread(0, 0, OtherThreadProc, 0, 0, &threadID);
_tprintf(_T("** Sleep() Main Thread\r\n"));
Sleep(10000);
::CloseHandle(hThread);
_tprintf(_T("** Resume Main Thread\r\n"));
_tprintf(_T("Reported File Size: %d bytes\r\n"), GetFileSize(hFile, NULL));
DWORD dwPos = sizeof(DWORD);
DWORD dwIn = 0;
_tprintf(_T("Old Data: %8.8x\r\nReading from 0x%8.8x\r\n"), dwData, dwPos);
dwData = 0;
::SetFilePointer(hFile, dwPos, 0, FILE_BEGIN);
dwErr = GetLastError();
if(dwErr != 0)
{
_tprintf(_T("Error during SetFilePointer()\r\n"));
EmitError(dwErr);
}
::ReadFile(hFile, &dwData, sizeof(DWORD), &dwIn, 0);
dwErr = GetLastError();
if(dwErr != 0)
{
_tprintf(_T("Error during ReadFile()\r\n"));
EmitError(dwErr);
}
else
{
_tprintf(_T("New Data: %8.8x\r\n%d bytes read.\r\n"), dwData, dwIn);
}
::CloseHandle(hFile);
_tprintf(_T("** End Main Thread\r\n"));
Sleep(10000);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment