ラベル .NET Framework の投稿を表示しています。 すべての投稿を表示
ラベル .NET Framework の投稿を表示しています。 すべての投稿を表示

2015年4月5日日曜日

メディアキーで操作できる小型MPDクライアント minmpc

Raspberry Pi 2 とフリスクDACでオーディオメディアサーバーを作っていい感じに音楽垂れ流し環境が出来たのはいいのだけれど、ちょっと停止したい! とか 今の曲もう一回聴きたい! とか、そんな操作が少しばかり不便なことに気付きました。

最近のキーボードによくついてるメディアキー(再生/一時停止、次の曲、前の曲 とかのボタン)でさくっと操作できればいいなと思ったのですが、気に入るものは見つけられませんでした。
欲しいのは次のような感じ。

  • Windowsで動作
  • ウィンドウがアクティブでなくてもメディアキーから操作可能
  • ウィンドウは小さくて勝手に隠れてくれる
  • プレイリストの操作等は優秀なソフトが他にあるのでなくてもいい
というわけでRxの勉強がてら作ってみました。

minmpc (github)

  • メディアキーでホットキー的に操作できて再生中の曲が表示されるだけです。
  • インストーラやビルド済みの実行ファイルは準備してません。
  • Visual Studio Community 2013 で「NuGet パッケージの復元の有効化」がONになっていればビルドできると思います。

作りはかなり粗い&荒いものなのでソースの公開に留めておきます。
決してめんどくさがってるわけじゃないですよ?_(:3 」∠)_

2013年1月4日金曜日

P/Invokeの規定の呼び出し規約

自前のunmanagedなdllを、.NETなアプリケーションからP/Invokeで使おうとした際に  pInvokeStackImbalance で躓いたメモです。
環境は Visual Studio 2010 / .NET Framework 4.0

unmanaged DLL 側はC++でこんな感じ。
extern "C" {
 __declspec(dllexport) bool
 ReadValue(wchar_t* buffer, unsigned int bufferLength) {
  wcscpy_s(buffer, bufferLength, L"hogehoge");
  return true;
 }
}
それをこんなC#コードで呼び出すと、デバッグ実行時に pInvokeStackImbalance で怒られます。
[DllImport("foo.dll", CharSet = CharSet.Unicode)]
public static extern bool ReadValue(StringBuilder buffer, uint bufferLength);
MSDN: DllImportAttribute.CallingConvention フィールド によると
DllImportAttribute.CallingConvention の規定値は Winapi。
これはプラットフォーム標準の呼び出し規約を使用することを示す。Windows なら StdCall。
よくP/InvokeされるWin32APIの場合はすべてStdCallなので規定値でOKですね。

というわけで今回は次ように呼び出し規約をきちんと指定してあげないといけない。
[DllImport("foo.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
public static extern bool ReadValue(
    StringBuilder buffer, uint bufferLength);
ちなみにこのエラーを検出している MDA (Managed Debugging Assistant) は、.NET Framework 3.5 では規定値で無効になっているらしいです。