mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
803 lines
21 KiB
803 lines
21 KiB
/*
|
|
** MEP Party extension
|
|
**
|
|
** History:
|
|
** 17-Oct-1991 Ported to NT
|
|
**
|
|
*/
|
|
|
|
#define _CTYPE_DISABLE_MACROS
|
|
#include <ctype.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#include "zext.h"
|
|
#include <winuserp.h>
|
|
|
|
#ifndef TRUE
|
|
#define TRUE -1
|
|
#define FALSE 0
|
|
#endif
|
|
|
|
HWND hwndSelf;
|
|
|
|
flagType iconizeOnExit = TRUE;
|
|
|
|
flagType pascal DoCaseLine(
|
|
PFILE CurFile,
|
|
LINE y,
|
|
COL x,
|
|
COL maxX,
|
|
flagType LowerCase
|
|
)
|
|
{
|
|
flagType Modified;
|
|
int cb;
|
|
char buf[ BUFLEN ], *s;
|
|
|
|
cb = GetLine( y, buf, CurFile );
|
|
s = &buf[ x ];
|
|
if (maxX != 0) {
|
|
if (maxX - x < cb) {
|
|
cb = maxX - x + 1;
|
|
}
|
|
}
|
|
else {
|
|
cb -= x;
|
|
}
|
|
|
|
Modified = FALSE;
|
|
while (cb--) {
|
|
if (LowerCase) {
|
|
if (*s >= 'A' && *s <= 'Z') {
|
|
*s -= 'A' - 'a';
|
|
Modified = TRUE;
|
|
}
|
|
}
|
|
else {
|
|
if (*s >= 'a' && *s <= 'z') {
|
|
*s += 'A' - 'a';
|
|
Modified = TRUE;
|
|
}
|
|
}
|
|
|
|
s++;
|
|
}
|
|
|
|
if (Modified) {
|
|
PutLine( y, buf, CurFile );
|
|
}
|
|
|
|
return( TRUE );
|
|
}
|
|
|
|
|
|
flagType pascal EXTERNAL
|
|
Case(
|
|
CMDDATA argData,
|
|
ARG far *pArg,
|
|
flagType fMeta
|
|
)
|
|
{
|
|
int i;
|
|
PFILE CurFile;
|
|
|
|
CurFile = FileNameToHandle("",NULL);
|
|
switch( pArg->argType ) {
|
|
case NOARG:
|
|
return( DoCaseLine( CurFile, pArg->arg.noarg.y, 0, 0, fMeta ) );
|
|
break;
|
|
|
|
case NULLARG:
|
|
return( DoCaseLine( CurFile,
|
|
pArg->arg.nullarg.y,
|
|
pArg->arg.nullarg.x,
|
|
0,
|
|
fMeta
|
|
)
|
|
);
|
|
break;
|
|
|
|
case LINEARG:
|
|
for (i=pArg->arg.linearg.yStart; i<=pArg->arg.linearg.yEnd; i++) {
|
|
if (!DoCaseLine( CurFile, (LINE)i, 0, 0, fMeta )) {
|
|
return( FALSE );
|
|
}
|
|
}
|
|
|
|
return( TRUE );
|
|
break;
|
|
|
|
case BOXARG:
|
|
for (i=pArg->arg.boxarg.yTop; i<=pArg->arg.boxarg.yBottom; i++) {
|
|
if (!DoCaseLine( CurFile,
|
|
(LINE)i,
|
|
pArg->arg.boxarg.xLeft,
|
|
pArg->arg.boxarg.xRight,
|
|
fMeta
|
|
)
|
|
) {
|
|
return( FALSE );
|
|
}
|
|
}
|
|
|
|
return( TRUE );
|
|
break;
|
|
|
|
default:
|
|
BadArg();
|
|
return( FALSE );
|
|
}
|
|
|
|
argData;
|
|
}
|
|
|
|
int CountMsgFiles;
|
|
int MsgFileIndex;
|
|
HANDLE MsgFiles[ 2 ];
|
|
int MsgFileOffsetIndex;
|
|
LONG MsgFileOffsets[ 3 ];
|
|
|
|
char
|
|
GetHexDigit(
|
|
ULONG value,
|
|
int index
|
|
)
|
|
{
|
|
int digit;
|
|
|
|
if (index < 4) {
|
|
index <<= 2;
|
|
digit = (int)((value >> index) & 0xF);
|
|
}
|
|
else {
|
|
digit = 0;
|
|
}
|
|
if (digit <= 9) {
|
|
return( (char)(digit+'0') );
|
|
}
|
|
else {
|
|
return( (char)((digit-10)+'A') );
|
|
}
|
|
}
|
|
|
|
void
|
|
MyFormatMessage(
|
|
char *buf,
|
|
char *msg,
|
|
long value1,
|
|
long value2
|
|
);
|
|
|
|
void
|
|
MyFormatMessage(
|
|
char *buf,
|
|
char *msg,
|
|
long value1,
|
|
long value2
|
|
)
|
|
{
|
|
char c, *src, *dst;
|
|
long value;
|
|
|
|
src = msg;
|
|
dst = buf;
|
|
while (c = *src++) {
|
|
if (c == '%' && src[1] == 'x') {
|
|
if (*src == '1') {
|
|
value = value1;
|
|
}
|
|
else {
|
|
value = value2;
|
|
}
|
|
|
|
*dst++ = GetHexDigit( value, 3 );
|
|
*dst++ = GetHexDigit( value, 2 );
|
|
*dst++ = GetHexDigit( value, 1 );
|
|
*dst++ = GetHexDigit( value, 0 );
|
|
src++;
|
|
src++;
|
|
}
|
|
else {
|
|
*dst++ = c;
|
|
}
|
|
}
|
|
|
|
*dst = '\0';
|
|
DoMessage( buf );
|
|
}
|
|
|
|
flagType pascal EXTERNAL
|
|
ShowBuildMessage(
|
|
CMDDATA argData,
|
|
ARG far *pArg,
|
|
flagType fMeta
|
|
)
|
|
{
|
|
int i, BytesRead, BytesScanned, linenum;
|
|
ULONG NewOffset;
|
|
char LineBuffer[ 256 ], *s, *s1;
|
|
|
|
if (!fMeta && CountMsgFiles == 0) {
|
|
MsgFileIndex = 0;
|
|
MsgFiles[ MsgFileIndex ] = CreateFile( "build.wrn",
|
|
GENERIC_READ,
|
|
FILE_SHARE_READ,
|
|
NULL,
|
|
OPEN_EXISTING,
|
|
0,
|
|
NULL
|
|
);
|
|
if (MsgFiles[ MsgFileIndex ] != INVALID_HANDLE_VALUE) {
|
|
CountMsgFiles++;
|
|
MsgFileIndex++;
|
|
}
|
|
|
|
MsgFiles[ MsgFileIndex ] = CreateFile( "build.err",
|
|
GENERIC_READ,
|
|
FILE_SHARE_READ,
|
|
NULL,
|
|
OPEN_EXISTING,
|
|
0,
|
|
NULL
|
|
);
|
|
if (MsgFiles[ MsgFileIndex ] != INVALID_HANDLE_VALUE) {
|
|
CountMsgFiles++;
|
|
MsgFileIndex++;
|
|
}
|
|
|
|
MsgFileIndex = 0;
|
|
MsgFileOffsetIndex = 0;
|
|
MsgFileOffsets[ 0 ] = 0L;
|
|
MsgFileOffsets[ 1 ] = 0L;
|
|
MsgFileOffsets[ 2 ] = 0L;
|
|
}
|
|
else
|
|
if (fMeta && CountMsgFiles != 0) {
|
|
for (i=0; i<CountMsgFiles; i++) {
|
|
CloseHandle( MsgFiles[ i ] );
|
|
}
|
|
|
|
CountMsgFiles = 0;
|
|
return( TRUE );
|
|
}
|
|
|
|
if (CountMsgFiles == 0) {
|
|
DoMessage( "No BUILD.WRN or BUILD.ERR message file." );
|
|
return( FALSE );
|
|
}
|
|
|
|
switch( pArg->argType ) {
|
|
case NULLARG:
|
|
if (MsgFileOffsetIndex-- == 0) {
|
|
MsgFileOffsetIndex = 2;
|
|
}
|
|
//
|
|
// fall through
|
|
//
|
|
|
|
case NOARG:
|
|
retrymsgfile:
|
|
NewOffset = SetFilePointer( MsgFiles[ MsgFileIndex ],
|
|
MsgFileOffsets[ MsgFileOffsetIndex ],
|
|
NULL,
|
|
FILE_BEGIN
|
|
);
|
|
if (NewOffset == -1) {
|
|
MyFormatMessage( LineBuffer,
|
|
"SetFilePointer( %1x ) failed - rc == %2x",
|
|
MsgFileOffsets[ MsgFileOffsetIndex ],
|
|
GetLastError()
|
|
);
|
|
DoMessage( LineBuffer );
|
|
return( FALSE );
|
|
}
|
|
|
|
if (!ReadFile( MsgFiles[ MsgFileIndex ],
|
|
LineBuffer,
|
|
sizeof( LineBuffer ),
|
|
( LPDWORD )&BytesRead,
|
|
NULL
|
|
)
|
|
) {
|
|
MyFormatMessage( LineBuffer,
|
|
"ReadFile( %1x ) failed - rc == %2x",
|
|
(ULONG)BytesRead,
|
|
GetLastError()
|
|
);
|
|
DoMessage( LineBuffer );
|
|
return( FALSE );
|
|
}
|
|
|
|
s = LineBuffer;
|
|
BytesScanned = 0;
|
|
while (BytesScanned < BytesRead) {
|
|
BytesScanned++;
|
|
if (*s == '\n') {
|
|
*s = '\0';
|
|
break;
|
|
}
|
|
else
|
|
if (*s == '\r' && s[1] == '\n') {
|
|
*s = '\0';
|
|
BytesScanned++;
|
|
break;
|
|
}
|
|
else {
|
|
s++;
|
|
}
|
|
}
|
|
|
|
if (BytesScanned == 0) {
|
|
if (++MsgFileIndex == CountMsgFiles) {
|
|
for (i=0; i<CountMsgFiles; i++) {
|
|
CloseHandle( MsgFiles[ i ] );
|
|
}
|
|
|
|
CountMsgFiles = 0;
|
|
DoMessage( "no more BUILD messages" );
|
|
return( FALSE );
|
|
}
|
|
else {
|
|
MsgFileOffsetIndex = 0;
|
|
MsgFileOffsets[ 0 ] = 0L;
|
|
MsgFileOffsets[ 1 ] = 0L;
|
|
MsgFileOffsets[ 2 ] = 0L;
|
|
goto retrymsgfile;
|
|
}
|
|
}
|
|
else {
|
|
NewOffset = MsgFileOffsets[ MsgFileOffsetIndex ];
|
|
|
|
if (++MsgFileOffsetIndex == 3) {
|
|
MsgFileOffsetIndex = 0;
|
|
}
|
|
|
|
MsgFileOffsets[ MsgFileOffsetIndex ] = NewOffset + BytesScanned;
|
|
}
|
|
|
|
s = LineBuffer;
|
|
while (*s) {
|
|
if (*s == '(') {
|
|
*s++ = '\0';
|
|
s1 = s;
|
|
while (s1 > LineBuffer && s1[-1] == ' ') {
|
|
*--s1 = '\0';
|
|
}
|
|
|
|
s1 = s;
|
|
while (*s && isdigit( *s )) {
|
|
s++;
|
|
}
|
|
*s++ = '\0';
|
|
linenum = atoi( s1 );
|
|
while (*s) {
|
|
if (*s++ == ':') {
|
|
PFILE pOldFile;
|
|
DWORD fOldFileFlags;
|
|
|
|
//
|
|
// Switch to correct file for message. If we change to
|
|
// a different file and the old one was modified, write
|
|
// it out.
|
|
//
|
|
|
|
pOldFile = FileNameToHandle( "", NULL );
|
|
fOldFileFlags = 0;
|
|
GetEditorObject( 0xFF | RQ_FILE_FLAGS, pOldFile, (PVOID)&fOldFileFlags );
|
|
fChangeFile( FALSE, LineBuffer );
|
|
if (pOldFile != FileNameToHandle( "", NULL ) &&
|
|
fOldFileFlags & DIRTY) {
|
|
FileWrite( "", pOldFile );
|
|
}
|
|
MoveCur( 0, (LINE)(linenum-1) );
|
|
fExecute( "begline" );
|
|
DoMessage( s+1 );
|
|
return( TRUE );
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
s++;
|
|
}
|
|
}
|
|
goto retrymsgfile;
|
|
|
|
default:
|
|
BadArg();
|
|
return( FALSE );
|
|
}
|
|
|
|
return( TRUE );
|
|
|
|
argData;
|
|
}
|
|
|
|
char ErrorText[ 64 ],
|
|
Arguments[ 64 + MAX_PATH ],
|
|
PathName[ MAX_PATH ];
|
|
|
|
flagType pascal EXTERNAL
|
|
SlmOut(
|
|
CMDDATA argData,
|
|
ARG far *pArg,
|
|
flagType fMeta
|
|
)
|
|
{
|
|
PFILE pCurFile;
|
|
char *FileName;
|
|
DWORD fFileFlags;
|
|
char OldCurrentDirectory[MAX_PATH];
|
|
|
|
pCurFile = FileNameToHandle( (char far *)"", (char far *)NULL );
|
|
fFileFlags = 0;
|
|
GetEditorObject( 0xFF | RQ_FILE_FLAGS, pCurFile, (PVOID)&fFileFlags );
|
|
GetEditorObject( 0xFF | RQ_FILE_NAME, pCurFile, (PVOID)PathName );
|
|
|
|
FileName = PathName + strlen( PathName );
|
|
while (FileName > PathName) {
|
|
if (*--FileName == '\\') {
|
|
*FileName++ = '\0';
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (FileName == PathName) {
|
|
DoMessage( "Unable to get directory for file" );
|
|
return( FALSE );
|
|
}
|
|
|
|
if (GetCurrentDirectory(sizeof(OldCurrentDirectory), OldCurrentDirectory) == 0) {
|
|
DoMessage( "Unable to save current directory setting" );
|
|
return( FALSE );
|
|
}
|
|
|
|
if (SetCurrentDirectory(PathName) != 0) {
|
|
strcpy( Arguments, "arg " );
|
|
|
|
if (fMeta) {
|
|
strcpy( Arguments, "cd & in -i " );
|
|
}
|
|
else {
|
|
strcpy( Arguments, "cd & out -z " );
|
|
}
|
|
strcat( Arguments, FileName );
|
|
strcat( Arguments, " & if ERRORLEVEL 1 pause" );
|
|
DoSpawn( Arguments, FALSE );
|
|
if (!fMeta && fFileFlags & DIRTY) {
|
|
FileWrite( "", pCurFile );
|
|
SetEditorObject( 0xFF | RQ_FILE_MODTIME, pCurFile, (PVOID)NULL );
|
|
if (fFileFlags & DIRTY) {
|
|
DoMessage( "Modified file has been checked out." );
|
|
}
|
|
else {
|
|
DoMessage( "Current file has been checked out." );
|
|
}
|
|
}
|
|
else {
|
|
if (fMeta) {
|
|
fExecute( "refresh" );
|
|
DoMessage( "Changes to current file discarded. No longer checked out." );
|
|
}
|
|
else {
|
|
SetEditorObject( 0xFF | RQ_FILE_MODTIME, pCurFile, (PVOID)NULL );
|
|
DoMessage( "Current file has been checked out." );
|
|
}
|
|
}
|
|
|
|
SetCurrentDirectory(OldCurrentDirectory);
|
|
return( TRUE );
|
|
}
|
|
else {
|
|
DoMessage( "Unable to change current directory" );
|
|
return( FALSE );
|
|
}
|
|
|
|
argData;
|
|
pArg;
|
|
fMeta;
|
|
}
|
|
|
|
|
|
HANDLE EditorStartEvent;
|
|
HANDLE EditorStopEvent;
|
|
HANDLE EditorSharedMemory;
|
|
LPSTR EditorMemoryPointer;
|
|
HWND hPrevWindow = NULL;
|
|
char CommandLineBuffer[ 256 ];
|
|
|
|
|
|
HWND
|
|
GetWindowHandleOfEditor( void );
|
|
|
|
void SwitchToProgram( HWND hwnd );
|
|
|
|
void
|
|
SwitchToTaskManager( void );
|
|
|
|
flagType pascal EXTERNAL
|
|
StartExt(
|
|
CMDDATA argData,
|
|
ARG far *pArg,
|
|
flagType fMeta
|
|
)
|
|
{
|
|
PFILE pCurFile;
|
|
int fFileFlags;
|
|
|
|
if (!fMeta) {
|
|
pCurFile = FileNameToHandle( "", NULL );
|
|
fFileFlags = 0;
|
|
GetEditorObject( 0xFF | RQ_FILE_FLAGS, pCurFile, (PVOID)&fFileFlags );
|
|
if (fFileFlags & DIRTY)
|
|
FileWrite( "", pCurFile );
|
|
}
|
|
|
|
if (hPrevWindow) {
|
|
SetEvent( EditorStopEvent );
|
|
SwitchToProgram( hPrevWindow );
|
|
hPrevWindow = NULL;
|
|
}
|
|
else {
|
|
SwitchToTaskManager();
|
|
}
|
|
|
|
fExecute( "savetmpfile" );
|
|
|
|
return TRUE;
|
|
argData;
|
|
pArg;
|
|
}
|
|
|
|
#if _MSC_FULL_VER >= 13008827
|
|
#pragma warning(push)
|
|
#pragma warning(disable:4715) // Not all control paths return (due to infinite loop)
|
|
#endif
|
|
|
|
DWORD
|
|
WaitForStartEventThread(
|
|
PVOID Parameter
|
|
)
|
|
{
|
|
CHAR szFileName[ 256 ];
|
|
LPSTR s, lpName, lpValue, lpNewCmdLine, lpEditorMem;
|
|
PINPUT_RECORD pEvent, pEvents;
|
|
DWORD NumberOfEvents, NumberOfEventsWritten;
|
|
|
|
while (TRUE) {
|
|
WaitForSingleObject( EditorStartEvent, INFINITE );
|
|
lpEditorMem = EditorMemoryPointer;
|
|
|
|
hPrevWindow = *(HWND *)lpEditorMem;
|
|
lpEditorMem += sizeof( hPrevWindow );
|
|
|
|
SetCurrentDirectory( lpEditorMem );
|
|
while( *lpEditorMem++ ) {
|
|
}
|
|
|
|
lpNewCmdLine = CommandLineBuffer;
|
|
while( *lpNewCmdLine++ = *lpEditorMem++ ) {
|
|
}
|
|
|
|
while (*lpEditorMem) {
|
|
lpName = lpEditorMem;
|
|
while (*lpEditorMem) {
|
|
if (*lpEditorMem++ == '=') {
|
|
lpValue = lpEditorMem;
|
|
lpValue[ -1 ] = '\0';
|
|
while (*lpEditorMem++) {
|
|
}
|
|
SetEnvironmentVariableA( lpName, lpValue );
|
|
lpValue[ -1 ] = '=';
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
s = CommandLineBuffer;
|
|
while (*s == ' ')
|
|
s++;
|
|
|
|
if (*s) {
|
|
NumberOfEvents = 1 + strlen( s ) + 1;
|
|
pEvents = HeapAlloc( GetProcessHeap(), 0, NumberOfEvents * sizeof( *pEvent ) );
|
|
pEvent = pEvents;
|
|
pEvent->EventType = KEY_EVENT;
|
|
FuncNameToKeyEvent( "arg", &pEvent->Event.KeyEvent);
|
|
pEvent += 1;
|
|
while (*s) {
|
|
pEvent->EventType = KEY_EVENT;
|
|
FuncNameToKeyEvent( (char *)(BYTE)*s++, &pEvent->Event.KeyEvent);
|
|
pEvent += 1;
|
|
}
|
|
pEvent->EventType = KEY_EVENT;
|
|
FuncNameToKeyEvent( "setfile", &pEvent->Event.KeyEvent);
|
|
pEvent += 1;
|
|
WriteConsoleInput( GetStdHandle( STD_INPUT_HANDLE ),
|
|
pEvents,
|
|
NumberOfEvents,
|
|
&NumberOfEventsWritten
|
|
);
|
|
HeapFree( GetProcessHeap(), 0, pEvents );
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
#if _MSC_FULL_VER >= 13008827
|
|
#pragma warning(pop)
|
|
#endif
|
|
|
|
|
|
|
|
void
|
|
SwitchToProgram(
|
|
HWND hwnd
|
|
)
|
|
{
|
|
if (hwndSelf && iconizeOnExit) {
|
|
ShowWindow( hwndSelf, SW_MINIMIZE );
|
|
}
|
|
|
|
SetForegroundWindow( hwnd );
|
|
ShowWindow( hwnd, SW_RESTORE);
|
|
}
|
|
|
|
void
|
|
SwitchToTaskManager( void )
|
|
{
|
|
HWND hwnd;
|
|
wchar_t szTitle[ 256 ];
|
|
|
|
/*
|
|
* Search the window list for task manager window.
|
|
*/
|
|
hwnd = GetWindow( GetDesktopWindow(), GW_CHILD );
|
|
while (hwnd) {
|
|
/*
|
|
* Only look at non-visible, non-owned, Top Level Windows.
|
|
*/
|
|
if (!IsWindowVisible( hwnd ) && !GetWindow( hwnd, GW_OWNER )) {
|
|
//
|
|
// Use internal call to get current Window title that does NOT
|
|
// use SendMessage to query the title from the window procedure
|
|
// but instead returns the most recent title displayed.
|
|
//
|
|
|
|
InternalGetWindowText( hwnd,
|
|
(LPWSTR)szTitle,
|
|
sizeof( szTitle )
|
|
);
|
|
if (!_wcsicmp( L"Task List", szTitle )) {
|
|
SwitchToProgram( hwnd );
|
|
break;
|
|
}
|
|
}
|
|
|
|
hwnd = GetWindow( hwnd, GW_HWNDNEXT );
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
flagType
|
|
StartExtLoaded( void );
|
|
|
|
flagType
|
|
StartExtLoaded ()
|
|
{
|
|
HANDLE Thread;
|
|
DWORD ThreadId;
|
|
|
|
hwndSelf = GetWindowHandleOfEditor();
|
|
EditorStartEvent = CreateEvent( NULL, FALSE, FALSE, "EditorStartEvent" );
|
|
if (EditorStartEvent == NULL) {
|
|
DoMessage( "Create of EditorStartEvent failed" );
|
|
return FALSE;
|
|
}
|
|
|
|
EditorStopEvent = CreateEvent( NULL, FALSE, FALSE, "EditorStopEvent" );
|
|
if (EditorStopEvent == NULL) {
|
|
DoMessage( "Create of EditorStopEvent failed" );
|
|
CloseHandle( EditorStartEvent );
|
|
return FALSE;
|
|
}
|
|
|
|
EditorSharedMemory = CreateFileMapping( INVALID_HANDLE_VALUE,
|
|
NULL,
|
|
PAGE_READWRITE,
|
|
0,
|
|
8192,
|
|
"EditorSharedMemory"
|
|
);
|
|
if (EditorSharedMemory == NULL) {
|
|
DoMessage( "Create of EditorStartMemory failed" );
|
|
CloseHandle( EditorStopEvent );
|
|
CloseHandle( EditorStartEvent );
|
|
return FALSE;
|
|
}
|
|
|
|
EditorMemoryPointer = MapViewOfFile( EditorSharedMemory,
|
|
FILE_MAP_READ | FILE_MAP_WRITE,
|
|
0,
|
|
0,
|
|
8192
|
|
);
|
|
if (EditorMemoryPointer == NULL) {
|
|
DoMessage( "MapView of EditorStartMemory failed" );
|
|
CloseHandle( EditorStopEvent );
|
|
CloseHandle( EditorStartEvent );
|
|
CloseHandle( EditorSharedMemory );
|
|
return FALSE;
|
|
}
|
|
|
|
Thread = CreateThread( NULL,
|
|
8192,
|
|
(LPTHREAD_START_ROUTINE)WaitForStartEventThread,
|
|
0,
|
|
0,
|
|
&ThreadId
|
|
);
|
|
|
|
if (Thread == NULL) {
|
|
DoMessage( "Can't start environment thread" );
|
|
UnmapViewOfFile( EditorMemoryPointer );
|
|
CloseHandle( EditorSharedMemory );
|
|
CloseHandle( EditorStopEvent );
|
|
CloseHandle( EditorStartEvent );
|
|
return FALSE;
|
|
}
|
|
|
|
if (!SetThreadPriority( Thread, THREAD_PRIORITY_ABOVE_NORMAL )) {
|
|
DoMessage( "Can't set priority of environment thread" );
|
|
}
|
|
|
|
CloseHandle( Thread );
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void partyWhenLoaded(void)
|
|
{
|
|
if (StartExtLoaded()) {
|
|
CountMsgFiles = 0;
|
|
}
|
|
}
|
|
|
|
|
|
HWND
|
|
GetWindowHandleOfEditor( void )
|
|
{
|
|
#define MY_BUFSIZE 1024 // buffer size for console window titles
|
|
HWND hwndFound; // this is what we return to the caller
|
|
char pszNewWindowTitle[ MY_BUFSIZE ]; // contains fabricated WindowTitle
|
|
char pszOldWindowTitle[ MY_BUFSIZE ] = {0}; // contains original WindowTitle
|
|
|
|
// fetch current window title
|
|
|
|
GetConsoleTitle( pszOldWindowTitle, MY_BUFSIZE );
|
|
|
|
// format a "unique" NewWindowTitle
|
|
|
|
wsprintf( pszNewWindowTitle, "%d/%d", GetTickCount(), GetCurrentProcessId() );
|
|
|
|
// change current window title
|
|
|
|
SetConsoleTitle( pszNewWindowTitle );
|
|
|
|
// insure window title has been updated
|
|
|
|
Sleep(40);
|
|
|
|
// look for NewWindowTitle
|
|
|
|
hwndFound = FindWindow( NULL, pszNewWindowTitle );
|
|
|
|
// restore original window title
|
|
|
|
SetConsoleTitle( pszOldWindowTitle );
|
|
|
|
return( hwndFound );
|
|
}
|