Windowsで共有メモリの使用WindowsサービスとWindowsアプリケーション間のやり取り
WindowsでWindowsサービスとアプリケーションの間の共有メモリによるデータのやり取りを確認していた。
割とコンピュータよりの情報をお届けします。
WindowsでWindowsサービスとアプリケーションの間の共有メモリによるデータのやり取りを確認していた。
先にopen62541をVisual Studio Express 2017 for Windows Desktopでビルドする記事を書いたが,x86用しか書いていなかったがx64用のビルドはどうするのか気になっていた。CMakeの-GオプションにWin64を追加するだけだった。
C#からDllImportする場合について可変長の配列を渡しあうのがつかれた。
DLLから可変長文字列を渡す場合にはstringを渡せばよい。stringとchar*(ただし,最後に\0が付いている文字列に限る)の変換関係は支援がついている。
固定長の配列はDllImportの時の記述で引数型としてByte[]やInt32[]やDouble[] などを書いておけばよい(固定長といっても,呼び出し時に配列サイズが分かっていればよいだけで,配列自体は呼び出し前までにサイズが固定されればよい(決まればよい))。この方法は,.NET Compact Frameworkでも使用できる。ただし,長さが.NET側で分からなくて,呼び出された先のDLLの側で決まる場合には少しトリックが必要である。その場合,DLL側ではSAFEARRAYとして扱うとよさそう。
OPC-UAの続き。python-opcuaは簡単なアプリでもPythonをインストールする必要があることに問題を感じてopen62541を使ってみようかと思った。
Visual Studio Professionalならテンプレートがついていてすぐできるのだが,Expressではdll作成のテンプレートがないので自分で設定しないといけない。
(なお,いったんプロジェクトを作ってしまうとExpressでも使える。)
最近 自分で作ったアプリとほかのソフトのつなぎでOPC UAに対応を迫られる場面があって,node opcuaを使用したが,通信が問題なく続いている間は問題がないが,いったん不具合があったときに再接続に失敗する不具合が解消せずpython-opcuaに乗り換えることになった。ところが,サンプルを見ても"ns=2;i=3"などのnodeid?のつけ方がわからずに苦労した。
前の記事でSocket.ioばかり使用していたが,とりあえずsocketでもよいのではないかと思って調べていたら,参考になりそうな記事があった。