Re: How to limit the number of instances of an application on a server?
Hi Phil,
this Situation is only handable via the sytemregistry/FileIO action by
Application Start/End.
U count a reference in registry up (same do COM) . And here too user can
change it at will.
www.aladin.com u can install a Dongle, and u have the same Senario ->
www.brstudio.com
U cant protect a doublicate instance, if an BackwardEngeneer has the force.
Check ur Windows Name :
BOOL CALLBACK CMyApp::searcher(HWND hWnd, LPARAM lParam)
{
DWORD result;
LRESULT ok = ::SendMessageTimeout(hWnd,
UWM_ARE_YOU_ME,
0, 0,
SMTO_BLOCK |
SMTO_ABORT_IF_HUNG,
200,
&result);
if(ok == 0)
return TRUE; // ignore this and continue
if(result == UWM_ARE_YOU_ME)
{ /* found it */
HWND * target = (HWND *)lParam;
*target = hWnd;
return FALSE; // stop search
} /* found it */
return TRUE; // continue search
} // CMyApp::searcher
//--------------------------------------------------------
BOOL CMyApp::InitInstance()
{
bool AlreadyRunning;
HANDLE hMutexOneInstance = ::CreateMutex( NULL, FALSE,
_T("MYAPPNAME-088FA840-B10D-11D3-BC36-006067709674"));
// what changes for the alternative solutions
// is the UID in the above call
// which will be replaced by a call on
// createExclusionName
AlreadyRunning = ( ::GetLastError() == ERROR_ALREADY_EXISTS ||
::GetLastError() == ERROR_ACCESS_DENIED);
And Create a Mutex :
BOOL CALLBACK CMyApp::searcher(HWND hWnd, LPARAM lParam)
{
DWORD result;
LRESULT ok = ::SendMessageTimeout(hWnd,
UWM_ARE_YOU_ME,
0, 0,
SMTO_BLOCK |
SMTO_ABORT_IF_HUNG,
200,
&result);
if(ok == 0)
return TRUE; // ignore this and continue
if(result == UWM_ARE_YOU_ME)
{ /* found it */
HWND * target = (HWND *)lParam;
*target = hWnd;
return FALSE; // stop search
} /* found it */
return TRUE; // continue search
} // CMyApp::searcher
//--------------------------------------------------------
BOOL CMyApp::InitInstance()
{
bool AlreadyRunning;
HANDLE hMutexOneInstance = ::CreateMutex( NULL, FALSE,
_T("MYAPPNAME-088FA840-B10D-11D3-BC36-006067709674"));
// what changes for the alternative solutions
// is the UID in the above call
// which will be replaced by a call on
// createExclusionName
AlreadyRunning = ( ::GetLastError() == ERROR_ALREADY_EXISTS ||
::GetLastError() == ERROR_ACCESS_DENIED);
greetings
Karsten Schulz
(www.kahnsoft.de)
"Phil" <pbruyant@yahoo.com> schrieb im Newsbeitrag
news:b3c14334-f2c6-485c-86d4-91d480661905@l42g2000hsc.googlegroups.com...
On 9 juin, 15:19, "Karsten Schulz" <kahnp...@freenet.de> wrote:
Hi Phil,
the internal processlist dont crrelates with users,they enumerate all
running Processes on the mashine.
U can easy count the name of ur modulename, by comparisation the
processlistnames.
Te name of your Application u can find out on different ways:
char
Fname[MAX_PATH];GetModuleFileName(NULL,Fname,sizeof(Fname)/sizeof(Fname[0]));
or
LPCSTR pAppName=AfxGetApp()->m_pszAppName
try it in a console app.
greetings
Karsten Schulz
"Phil" <pbruy...@yahoo.com> schrieb im
Newsbeitragnews:c988a1a7-1a25-46c3-839c-11d664814130@59g2000hsb.googlegroups.com...
On 9 juin, 13:56, "Karsten Schulz" <kahnp...@freenet.de> wrote:
Hi Phil,
u can enumerate al running Processes easy,
greetings and Best Regards
Karsten Schulz
--www.kahnsoft.de
Thanks
Can this code find instances of the application when run by the other
users ?
-P
I now see a major drawback to this solution: process.szExeFile
contains the name of the .exe file (same thing for the module's name
in it). Thus, if one creates a copy of the .exe file with another
name, your code sees it as a different program, not as a new instance
of the same program.
-P