2018年4月13日金曜日

何故 NancyFx をえらんだのか… につきまして

自動登録をサービスプロセスで実装しています。
- GUI がございません。
- ではどのようにして状況を確認できるようにするか… Web サーバーを実装するしかない。

何故サービスプロセスなのか…
- 各クライアント PC での Verup が大変だからです。
- サーバーで動作させるようにした。
- さらーに『本来クライアントで動作する NisImp を、サーバーで動かしてほしい!』というご要望があり、「お客さんは GUI を欲していないのかもしれない」という結論に行き着いたため。

何故ナンシーか…
- では他になにが…?

質問してきた彼によると →
- Frameworks
- Jasper
- Nancy
- SignalR
- WebApi
- WebSharper
- DuoVia.Http
- Simplify.Web
- Wisej

Nancy のメリットとして
- stackoverflow など情報量が多い。



ここから by KU

当初からつぎの 2 つに的を絞っていた…
Kayak
Nancy

「『軽量な C# Web サーバー』で考えていたため」
軽量な:
- ワンプロセスで完結する
- 別途のインストールが不要(そう。Apache とか php とか PostgreSQL とかいったもの)

評価の結果、Kayak がいい感じと思っていた。しかし、開発が止まっていた。
評価
- (URL の予約に)管理者権限が必要になる HttpListener を使っているか。
 → 使っていない。自分で TCP ポートを使用
 → 👍

結局 Nancy にした。

2018年4月12日木曜日

xxx.dll.a ではなく xxx.notdll.a へ

xxx.dll.a はインポートライブラリーです。
これをリンクすると xxx.dll を配布することになります。

しかし、意図的に xxx.a をスタティックリンクしたい場合があります。
xxx.dll を配布したくない場合など。

そこで xxx.notdll.a をリンクすることで、
xxx.dll → xxx.a へリダイレクションしたい。

具体的には:
; _deflate
extern _deflate
global __imp__deflate
__imp__deflate:
 dd _deflate
__imp__deflate はポインターです。
_deflate のアドレスを設定するような .asm を書き、
.obj にコンパイルして、
.notdll.a ライブラリを作成する方法をとりました。

こちらの内容を自動化する、
xxx.dll.a から xxx.notdll.a を作出するスクリプト notdll.sh を開発しました。https://gist.github.com/kenjiuno/bdbd6c3311f4abc94e6ad1b3ac74bdbf

---
ちなみに依存している xxx.dll たちを収集したい場合のコマンドはこちら。

$ cygcheck.exe ./pdftoppm.exe | tr -d '\r' | tr '\\' '/' | grep -vi "system32" | xargs -L1 -I{} cp {} .
今日のバージョン

$ cygcheck.exe ./smbclient | grep -Eoe "cyg[^\.]+\.dll" | uniq | xargs which | xargs.exe -I "SRC" cp SRC .

---
MinGW32 (32 ビット版)

cdecl
  • C ソースコードでは malloc 
  • .lib (.dll.a) ファイルでは _malloc 
  • DLL では malloc


stdcall
  • C ソースコードでは GetProcAddress
  • .lib (.dll.a) ファイルでは _GetProcAddress@8
  • DLL では GetProcAddress

$ objdump -t /mingw32/i686-w64-mingw32/lib/libmsvcrt.a | grep "malloc"
[  7](sec  1)(fl 0x00)(ty   0)(scl   2) (nx 0) 0x00000000 _malloc

$ objdump -p /c/Windows/SysWOW64/msvcrt.dll | grep "malloc"
        [1279] malloc

$ objdump.exe -t /mingw32/lib/libz.dll.a | grep "deflate"
[  6](sec  1)(fl 0x00)(ty   0)(scl   2) (nx 0) 0x00000000 _deflate
[  7](sec  3)(fl 0x00)(ty   0)(scl   2) (nx 0) 0x00000000 __imp__deflate

$ objdump.exe -t /mingw32/lib/libz.a | grep "deflate"
[ 16](sec  1)(fl 0x00)(ty  20)(scl   2) (nx 0) 0x00001670 _deflate

$ objdump.exe -p /mingw32/bin/zlib1.dll | grep "deflate"
        [  17] deflate

stdcall 規約関数にも付くようようです。

$ objdump -t /mingw32/i686-w64-mingw32/lib/libkernel32.a | grep "GetProcAddress"
[  7](sec  1)(fl 0x00)(ty   0)(scl   2) (nx 0) 0x00000000 _GetProcAddress@8
[  8](sec  5)(fl 0x00)(ty   0)(scl   2) (nx 0) 0x00000000 __imp__GetProcAddress@8

$ objdump -p /c/Windows/SysWOW64/kernel32.dll | grep "GetProcAddress"
        a3a58      21  GetProcAddress
        [ 684] GetProcAddress

インポートライブラリを作成したい Make import library

Microsoft Visual C++ 方式で

foo.def を作成↓
LIBRARY postgres.exe
EXPORTS CurrentMemoryContext

lib を使って、インポートライブラリを作成↓
lib /out:x64\foo.lib /def:foo.def /machine:x64
lib /out:x86\foo.lib /def:foo.def /machine:ix86

作ったインポートライブリを使って、リンクします。

参考: http://openlab.ring.gr.jp/tsuneo/soft/tar32_1/tar32_1/SDK/DLL2LIB.TXT

参考: x64用のdllファイルからインポートライブラリ(.lib)を生成

MinGW 方式で

ZwFsControlFile を

ZwFsControlFile.def

LIBRARY NTDLL.DLL
EXPORTS ZwFsControlFile@40

$ dlltool.exe -mi386 -d ZwFsControlFile.def -Ak -l ZwFsControlFile.lib

ZwFsControlFile64.def

LIBRARY NTDLL.DLL
EXPORTS ZwFsControlFile

$ dlltool.exe -mi386:x86-64 -d ZwFsControlFile64.def -l ZwFsControlFile64.lib