ウィモバの日々

Windowsをモバイルする…それがウィモバ(仮)。手のひら端末が好きです

NjslyrViewerWM ver1.0.0.4とC#でクリップボードをAPI操作するおはなし

ということで、NjslyrViewerWMも1.0.0.4になって本文やらのコピーが出来るようになったよぉー!あらめでたい!
http://island.geocities.jp/flcl_ride_on_shooting_star/soft/index.html

んでせっかくだからメモ。
相変わらずWindows環境とWindowsMobile環境で同じバイナリを動かすべく小細工をしているんだけども・・・
クリップボード.net frameworkの機能と提供されているけど
その機能 Clipboard.SetObject をWindows環境で使おうとするとスレッドなんたらいうエラーが出て堕ちてしまう><;
まあその根本的な原因はプロセスがどうたら・・・というので解決できないみたい。
でもwindows環境でコピー出来ないままというのはマズいと思ったので、windows環境ではWIN32APIで動かすようにしようと考えてみた。

そこで、色々調べてみたらそのものズバリ!なクリップボードの使い方が出てきた。
http://www.pinvoke.net/default.aspx/coredll.setclipboarddata

上の中に出てくるMemoryクラスやStringPtr構造体なんかはこっちにある。
http://www.microsoft.com/japan/msdn/net/compactframework/netcfadvinterop.aspx

このサイトのソースをほぼそのまま流用しつつdllimportはwindows環境に合わせて修正したりしたら、なんとコピー出来た!
ヤター!と思ったら、何度もコピーを繰り返していくと挙動がおかしくなってアプリが不正終了しちゃう><

どうやら、AllocHLocalでメモリを確保して
SetClipboardData()でクリップボードに送った後、
その確保したメモリをLocalFreeで解放するとマズいのかな?
原理はよく分からないけど、メモリを解放しないようにしたら動作が安定した・・・
でもこれメモリリークしてるのかな?うーん、ちょっと怖いけどまあいいや(えっいいの!?)