Одна копия приложнения в CF.NET 1.0
От: george.forest  
Дата: 26.04.06 10:55
Оценка:
Не могу никак организовать одну копию приложения!

Как я понял на Pocket PC, если приложение уже запущено то при повторном запуске exe файла будет просто показана уже запущенная копия.
Но есть одно НО: если ни одна копия не запущена и мы несколько раз нажмем среднюю кнопку на девайсе на запуск выбранного приложения, то запустится несколько копий, так как ни одна не успеет показать свое окно(видим крутящийся сектор) и следовательно не запретит запуск нового приложения

пробовал следуующее:
1. Использование Mutex — очень обрезан для CF, как что отслеживание реализовать нельзя.
2. Вызов API FindWindow — тоже не работает, так как окна не успевают создаться.

Можно реестр, но класса для работы с ним не реализовано в 1.0. Так что разве что API функциями, но для этого нужно тащить в .NET кучу структур!

Может кто сталкивался с этой проблемой или у кого есть идеи?
Re: Одна копия приложнения в CF.NET 1.0
От: Plutonia Experiment Беларусь http://blogs.rsdn.org/ikemefula
Дата: 26.04.06 10:58
Оценка:
Здравствуйте, george.forest, Вы писали:

GF>Можно реестр, но класса для работы с ним не реализовано в 1.0. Так что разве что API функциями, но для этого нужно тащить в .NET кучу структур!


GF>Может кто сталкивался с этой проблемой или у кого есть идеи?


Шаред секция в длл подойдет ?
Re[2]: Одна копия приложнения в CF.NET 1.0
От: george.forest  
Дата: 26.04.06 11:04
Оценка:
Здравствуйте, Plutonia Experiment, Вы писали:

PE>Шаред секция в длл подойдет ?


А как это организовать?
Re[3]: Одна копия приложнения в CF.NET 1.0
От: Plutonia Experiment Беларусь http://blogs.rsdn.org/ikemefula
Дата: 26.04.06 11:07
Оценка:
Здравствуйте, george.forest, Вы писали:

GF>Здравствуйте, Plutonia Experiment, Вы писали:


PE>>Шаред секция в длл подойдет ?


GF>А как это организовать?


Эээ, я погорячился. Не заметил что речь про CF NET
Re: Одна копия приложнения в CF.NET 1.0
От: dimchick Украина  
Дата: 26.04.06 16:02
Оценка:
On Wed, 26 Apr 2006 13:55:40 +0300, george.forest <53808@users.rsdn.ru>
wrote:

> Не могу никак организовать одну копию приложения!

>
> Как я понял на Pocket PC, если приложение уже запущено то при повторном
> запуске exe файла будет просто показана уже запущенная копия.
> Но есть одно НО: если ни одна копия не запущена и мы несколько раз
> нажмем среднюю кнопку на девайсе на запуск выбранного приложения, то
> запустится несколько копий, так как ни одна не успеет показать свое
> окно(видим крутящийся сектор) и следовательно не запретит запуск нового
> приложения
>
> пробовал следуующее:
> 1. Использование Mutex — очень обрезан для CF, как что отслеживание
> реализовать нельзя.
> 2. Вызов API FindWindow — тоже не работает, так как окна не успевают
> создаться.
>
> Можно реестр, но класса для работы с ним не реализовано в 1.0. Так что
> разве что API функциями, но для этого нужно тащить в .NET кучу структур!
>
> Может кто сталкивался с этой проблемой или у кого есть идеи?

Не уверен что отработает на CF — в Win32 я создавал именнованные Kernel
объекты
    HANDLE _Mutex = CreateMutex ( NULL, TRUE, "MY_NAME::MY_APP" );
    if( GetLastError() == ERROR_ALREADY_EXISTS ) return 1;

Возможно такое же можно сделать в CF через System.Runtime.InteropServices;

На крайняк создавай temporary file. Дважды файл создать не удастся. По
закрытию апликухи — удаляй.
Короче копай в сторону междупроцессорного взаимодействия
Posted via RSDN NNTP Server 2.0
Re: Одна копия приложнения в CF.NET 1.0
От: Awaken Украина  
Дата: 26.04.06 19:22
Оценка:
GF>пробовал следуующее:
GF>1. Использование Mutex — очень обрезан для CF, как что отслеживание реализовать нельзя.

создавал именованный мутекс. все работает.
в качестве имени мутекса имя и версия сборки (чтоб уж наверняка)
Re[2]: Одна копия приложнения в CF.NET 1.0
От: GForest  
Дата: 27.04.06 07:41
Оценка:
Здравствуйте, Awaken, Вы писали:

A>создавал именованный мутекс. все работает.

A>в качестве имени мутекса имя и версия сборки (чтоб уж наверняка)

В CF .NET 1.0 именованый мутекс сздать нельзя, этот конструктор просто не реализован
Re[2]: Одна копия приложнения в CF.NET 1.0
От: Lloyd Россия  
Дата: 27.04.06 07:49
Оценка:
Здравствуйте, dimchick, Вы писали:

D>Не уверен что отработает на CF — в Win32 я создавал именнованные Kernel

D>объекты
D>
D>    HANDLE _Mutex = CreateMutex ( NULL, TRUE, "MY_NAME::MY_APP" );
D>    if( GetLastError() == ERROR_ALREADY_EXISTS ) return 1;
D>




1. Использование Mutex — очень обрезан для CF, как что отслеживание реализовать нельзя.

... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Одна копия приложнения в CF.NET 1.0
От: Awaken Украина  
Дата: 27.04.06 08:14
Оценка:
GF>В CF .NET 1.0 именованый мутекс сздать нельзя, этот конструктор просто не реализован

не библиотечным классом а через интероп.
в CF интероп и Win32 напрямую приходится очень часто юзать, ибо библиотека там урезанная.
через него например клипборд реализуется, евенты с таймаутами, да и много чего.
Re[3]: Одна копия приложнения в CF.NET 1.0
От: Awaken Украина  
Дата: 27.04.06 08:18
Оценка:
L>

L>1. Использование Mutex — очень обрезан для CF, как что отслеживание реализовать нельзя.


Interop рулит!!!!
а еще есть OpenNet.CF где многие велосипеды уже изобретены
Re[4]: Одна копия приложнения в CF.NET 1.0
От: GForest  
Дата: 27.04.06 11:17
Оценка: 1 (1)
Здравствуйте, Awaken, Вы писали:

GF>>В CF .NET 1.0 именованый мутекс сздать нельзя, этот конструктор просто не реализован


A>не библиотечным классом а через интероп.

A>в CF интероп и Win32 напрямую приходится очень часто юзать, ибо библиотека там урезанная.
A>через него например клипборд реализуется, евенты с таймаутами, да и много чего.

Спасибо!
Все получилось!

Вот пример для того кому может тоже понадобится:


enum WinError
{
    ERROR_ALREADY_EXISTS = 183
}

[DllImport("coredll.dll")]
public static extern int CreateMutex(IntPtr lpMutexAttributes, bool bInitialOwner, string lpName);

[DllImport("coredll.dll")]
public static extern int GetLastError();



static void Main()
{
    // Prevent more then one instance of an application
    Win32.CreateMutex(IntPtr.Zero, false, "ONE");
    if (Win32.GetLastError() == (int)WinError.ERROR_ALREADY_EXISTS)
        return;
            
    // Run
    Application.Run(new Form1());
}
Re[5]: Одна копия приложнения в CF.NET 1.0
От: dimchick Украина  
Дата: 27.04.06 15:56
Оценка:
Здравствуйте, GForest, Вы писали:

GF>Здравствуйте, Awaken, Вы писали:


GF>>>В CF .NET 1.0 именованый мутекс сздать нельзя, этот конструктор просто не реализован


A>>не библиотечным классом а через интероп.

A>>в CF интероп и Win32 напрямую приходится очень часто юзать, ибо библиотека там урезанная.
A>>через него например клипборд реализуется, евенты с таймаутами, да и много чего.

GF>Спасибо!

GF>Все получилось!

GF>Вот пример для того кому может тоже понадобится:



GF>
GF>enum WinError
GF>{
GF>    ERROR_ALREADY_EXISTS = 183
GF>}

GF>[DllImport("coredll.dll")]
GF>public static extern int CreateMutex(IntPtr lpMutexAttributes, bool bInitialOwner, string lpName);

GF>[DllImport("coredll.dll")]
GF>public static extern int GetLastError();



GF>static void Main()
GF>{
GF>    // Prevent more then one instance of an application
GF>    Win32.CreateMutex(IntPtr.Zero, false, "ONE");
GF>    if (Win32.GetLastError() == (int)WinError.ERROR_ALREADY_EXISTS)
GF>        return;
            
GF>    // Run
GF>    Application.Run(new Form1());
GF>}
GF>


Вот сайт на котором можно найти почти все P/Invoke обвертки
http://www.pinvoke.net/search.aspx?search=CreateMutex&amp;namespace=[All]
Для CF нужно только уточнять в MSDN библиотеку, из которой ты хочешь взять ф-ию.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.