河童さん

あれやそれ

データ共有アプリ

2023-09-21 20:27:58 | Rust

クリップボード共有アプリを作ったけど、実はあれ、当初考案したアプリを作れなかったので、無理くり作ったヤツだった。

 

当初は、リッチテキストに色々書いて、共有するのが目的だったんだけど、使用したwin32apiラッパーのクレートがリッチテキストの保存・読込みに対応してなかったので放棄した。

悩んだ末に、クリップボード共有アプリになったんだけど、やっぱり当初考えたアプリが気になるので、MS嫌いなのにwin32apiを調べ始める。

 

  • win32api

昔のapiだから、全部関数。

しかも、引数更新系。

うわ~、古っ。

データは、構造体で、引数として渡す。

処理は、対象ウィンドウ(コントロール)にメッセージ飛ばして、処理してもらう。

引数は2個決まってて、あらゆる変数をその引数にキャストして渡してる。

しかも、int を用途毎に別名作ってるので、一目で何に使うのか分かりやすいんだろうけど、何するにもキャストキャストキャスト。

うーん、全く勉強する気にならん。

 

  • クレート改造

とは言え、勉強しなきゃクレート改造も出来ないので、ちまちま勉強して、クレート改造に取り組む。

リッチテキスト自体は、導入されてて、機能は、書式設定のみ使える。

後は、保存と読み込みのメッセージを投げて、処理するようにすればよい。

メッセージ用の定数をヘッダファイル見つつ、追記。

保存・読込み用の構造体があるので、これもヘッダファイル見つつ、追記。

構造体のメンバにコールバック関数があるから、これも追記。

 

試しに動かしてみるが、当然動かないw

まぁ、そんな簡単に動くわけないよな。

win32apiのデータ型とRustのデータ型が違うので、コールバック関数に何設定すればいいのか、分からん。

更新引数はmut付ければいいのか?

Rustは生ポインタ使わないから、どう書けばいいのやら?(unsafe内なら使えるけど)

 

他のwin32apiのクレートを参照しつつ、書き換えていく。

データ型は、たぶんOKなんだが、ボタン押すとアプリが落ちる。

せめてコンソールにエラー出してくれぇぇぇ。

 

他のクレートを参照しまくって、見つけた!

同じような構造体定義にpackedを使ってた。

意味が分からんが、記載して、動かしたら、動いた!!

 

どうやら、メモリの空きを詰めるのがpackedらしい。

それだとC言語の想定しているメモリアドレスと違ってくるから、逆に落ちそうだけど、何故動くのか?

原因は分からんまま、動いたので、良しとする。

 

  • データ共有アプリ作成

win32apiラップクレート改が出来たので、さっそく当初想定したアプリを作る。

クリップボード共有アプリのソースをコピペしつつ、画面デザインしつつ、完成。

今回は、「転送」ボタン押すとリッチテキストファイルに保存。

タイマーで1秒毎にリッチテキストファイルの更新を監視して、更新されてたら、自動読込み。

ボタン1個になったので、手間が減った。

しかも、クリップボード共有アプリでは、実現できなかった、書式付テキスト、表を転送出来るようになった。

これで思いついたアプリを作る事が出来て満足~。

 

  • 画像の不具合

さっそく、別アプリ作ったよ~、と周知して、一人満足感に浸ってたら、画像が貼り付けできないと報告あり。

そういや転送される事しか確認してなかった。

転送後の画像をコピーして、Excelに張り付けたら、「Image」と文字列で張り付く。

うがぁぁぁぁ、そういやリッチテキストファイルって、全部文字列で保存していたな。

見た目画像なので、失念してた。

リッチテキストに対応している、ワードパッドとWordは、画像として貼り付けできるが、ExcelとTeamsにはImageと文字列で張り付く。

 

どうにもならんので、Excelには、形式指定貼り付けして。TeamsはExcelに張り付けた画像をコピペして、と対策案を提示。

 

コピーした文字列を画像に変換出来ればいいんだけど、どうやればいいのか、さっぱり分からん。

分かる方、教えて~。

 


最新の画像もっと見る

コメントを投稿