C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[8]: compack framework 2重起動


(過去ログ 112 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■66428 / inTopicNo.1)  compack framework 2重起動
  
□投稿者/ sugimoto (1回)-(2013/04/23(Tue) 10:35:49)

分類:[.NET 全般] 

Compact Framework で二重起動防止を行いたいと思い下記のようなコードを書きました

Public Declare Function CreateMutex Lib "CoreDll.dll" Alias "CreateMutexW" _
(ByVal lpMutexAttributes As IntPtr, _
ByVal InitialOwner As Boolean, _
ByVal MutexName As String) As IntPtr

'DLLのエラーを取得するAPI
Public Declare Function GetLastError Lib "CoreDll.dll" () As Int32

Public Declare Function ReleaseMutex Lib "CoreDll.dll" _
(ByVal hMutex As IntPtr) As Boolean

Public Declare Function CloseHandle Lib "CoreDll.dll" _
(ByVal hObject As IntPtr) As Boolean

<MTAThread()> _
Shared Sub Main()
'二重起動抑止
Dim mutexHandle As IntPtr = IntPtr.Zero
Dim myName As String = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name
mutexHandle = CreateMutex(IntPtr.Zero, False, myName)
If GetLastError() <> 183 Then
Application.Run(New LOGIN)
Else
MessageBox.Show("アプリケーションは既に起動しています。")
End If
ReleaseMutex(mutexHandle)
CloseHandle(mutexHandle)
End Sub 'Main

ところが、GetLastErrorが「87」を返してきます。
どこがおかしいのか、お手上げ状態です。ご回答どうぞよろしくお願いします。
引用返信 編集キー/
■66430 / inTopicNo.2)  Re[1]: compack framework 2重起動
□投稿者/ とっちゃん (102回)-(2013/04/23(Tue) 10:49:31)
とっちゃん さんの Web サイト
No66428 (sugimoto さん) に返信
> Compact Framework で二重起動防止を行いたいと思い下記のようなコードを書きました
>
<<略>>
> ところが、GetLastErrorが「87」を返してきます。

エラー番号「87」は、ERROR_INVALID_PARAMETER という識別子が与えられたエラーで
呼出しパラメータが間違っているというエラーになります。

おそらく、
Dim myName As String = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name
で取得される名前に問題があると思われます。

CE系OSでの扱いがどうなってるかわかりませんが、通常のデスクトップOSでは、'\'が含まれた文字列は利用できません。
おそらく、CE系だからといってそこが違うということはないと思うので、名前に\が含まれていないかチェックしてみてはいかがでしょう?

ほかに、パラメータでおかしそうなものはないので、おそらくはそれだと思います。

ただ、CE系のOSは何一つ持ってないし(WindowsMobileも含め)、MSDNからももういなくなってるのでもしかしたら違うかもしれません。
#長さの制約があるなどがある可能性もあるため

ですので、CreateMutex のCE系OS(対象プラットフォームとしているOS)用のリファレンスもチェックすることをお勧めします。





引用返信 編集キー/
■66434 / inTopicNo.3)  Re[2]: compack framework 2重起動
□投稿者/ sugimoto (3回)-(2013/04/23(Tue) 11:28:57)
とっちゃんさん、さっそくのご回答ありがとうございます。

> おそらく、
> Dim myName As String = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name
> で取得される名前に問題があると思われます。
>
> CE系OSでの扱いがどうなってるかわかりませんが、通常のデスクトップOSでは、'\'が含まれた文字列は利用できません。
> おそらく、CE系だからといってそこが違うということはないと思うので、名前に\が含まれていないかチェックしてみてはいかがでしょう?
>

名前に\は含まれていませんでした「SmartDeviceProject1」とちょっと長めですが、ブレークポイントを置いて取得できていたことを
確認しました。


> ほかに、パラメータでおかしそうなものはないので、おそらくはそれだと思います。
>
> ただ、CE系のOSは何一つ持ってないし(WindowsMobileも含め)、MSDNからももういなくなってるのでもしかしたら違うかもしれません。
> #長さの制約があるなどがある可能性もあるため
> ですので、CreateMutex のCE系OS(対象プラットフォームとしているOS)用のリファレンスもチェックすることをお勧めします。

OS用のリファレンスのチェックはどうしたらいいのかよくわかりませんが、名前をもう少し短くしてみます。

引用返信 編集キー/
■66435 / inTopicNo.4)  Re[3]: compack framework 2重起動
□投稿者/ とっちゃん (103回)-(2013/04/23(Tue) 11:49:59)
とっちゃん さんの Web サイト
No66434 (sugimoto さん) に返信

> 名前に\は含まれていませんでした「SmartDeviceProject1」とちょっと長めですが、ブレークポイントを置いて取得できていたことを
> 確認しました。
>
あら。。。はずれか。



> OS用のリファレンスのチェックはどうしたらいいのかよくわかりませんが、名前をもう少し短くしてみます。
>
開発ツールに付属しているMSDNライブラリをインストールすれば見れると思います。
少なくとも、Windows Phone が出てきたころまでは、MSDNライブラリに含まれていましたので。

引用返信 編集キー/
■66438 / inTopicNo.5)  Re[4]: compack framework 2重起動
□投稿者/ sugimoto (5回)-(2013/04/23(Tue) 12:32:21)
No66435 (とっちゃん さん) に返信
> ■No66434 (sugimoto さん) に返信

EXE名を短く(5ケタ)にしてみましたが、NGでした。
もう、わけわからなくなってしまいました。。。
MSDNライブラリをいまから覗いてみますが、解決できそうにありません。。。


引き続き解決案を募集します。皆様、お知恵をよろしくお願いします。


>
>>名前に\は含まれていませんでした「SmartDeviceProject1」とちょっと長めですが、ブレークポイントを置いて取得できていたことを
>>確認しました。
>>
> あら。。。はずれか。
>
>
>
>>OS用のリファレンスのチェックはどうしたらいいのかよくわかりませんが、名前をもう少し短くしてみます。
>>
> 開発ツールに付属しているMSDNライブラリをインストールすれば見れると思います。
> 少なくとも、Windows Phone が出てきたころまでは、MSDNライブラリに含まれていましたので。
>
引用返信 編集キー/
■66439 / inTopicNo.6)  Re[5]: compack framework 2重起動
□投稿者/ とっちゃん (105回)-(2013/04/23(Tue) 13:10:58)
とっちゃん さんの Web サイト
No66438 (sugimoto さん) に返信

検索してみたら同じような記述(C#とVBの違いくらいしかないように読める)のページがありました。
http://slashcolon.com/wordpress/2008/08/21/compact-framework%e3%81%a7%e4%ba%8c%e9%87%8d%e8%b5%b7%e5%8b%95%e9%98%b2%e6%ad%a2/

とりあえず役に立ちそうなページではなさそうですね。。。



引用返信 編集キー/
■66441 / inTopicNo.7)  Re[6]: compack framework 2重起動
□投稿者/ sugimoto (7回)-(2013/04/23(Tue) 13:28:54)
No66439 (とっちゃん さん) に返信
> ■No66438 (sugimoto さん) に返信
>
> 検索してみたら同じような記述(C#とVBの違いくらいしかないように読める)のページがありました。
> http://slashcolon.com/wordpress/2008/08/21/compact-framework%e3%81%a7%e4%ba%8c%e9%87%8d%e8%b5%b7%e5%8b%95%e9%98%b2%e6%ad%a2/
>

検索までしていただいてありがとうございます。
実は、ご指定のページを参考にしてコードを作ってみた結果です。。。

引用返信 編集キー/
■66443 / inTopicNo.8)  Re[7]: compack framework 2重起動
□投稿者/ とっちゃん (106回)-(2013/04/23(Tue) 13:44:53)
とっちゃん さんの Web サイト
No66441 (sugimoto さん) に返信
> ■No66439 (とっちゃん さん) に返信
>>■No66438 (sugimoto さん) に返信
>>
>>検索してみたら同じような記述(C#とVBの違いくらいしかないように読める)のページがありました。
>>http://slashcolon.com/wordpress/2008/08/21/compact-framework%e3%81%a7%e4%ba%8c%e9%87%8d%e8%b5%b7%e5%8b%95%e9%98%b2%e6%ad%a2/
>>
>
> 検索までしていただいてありがとうございます。
> 実は、ご指定のページを参考にしてコードを作ってみた結果です。。。
>
あ、記述のもとになったページなんですね。。。似てるからそうかなぁ?とは思ったんですが。。。

念のため、C#で動くかどうかを試してみてはいかがでしょう?
C#で動いているようなら、VBに変換したときに何かをミスしているとなるでしょうし(CreateMutexWとしているなど微妙に違ってますよね)
C#でも動かないということなら何か根本的なアプローチが間違っている(理由はわかりません)となるでしょうし。。。

引用返信 編集キー/
■66451 / inTopicNo.9)  Re[8]: compack framework 2重起動
□投稿者/ sugimoto (8回)-(2013/04/23(Tue) 17:16:20)
No66443 (とっちゃん さん) に返信

C#はプログラムの経験がないので断念しました。

GetLastError() を使用せずSystem.Runtime.InteropServicesをImportsして
If Marshal.GetLastWin32Error <> 183 Then・・・・としたところうまく2重起動を感知しました。

いろいろありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -