実験用のNFCアンテナを作ってみる。のちのちPCB内層を利用することを考えて平面で。
アンテナを小さい長方形にしてみる。
実験用のNFCアンテナを作ってみる。のちのちPCB内層を利用することを考えて平面で。
アンテナを小さい長方形にしてみる。ちょっとくどいけど、実際こういう実装になることってあると思うのでやっておく。
作ったのがこちら。内寸16mm×5mm。長方形というか長円になっちゃった。
特性を測定してみる。
インダクタンス値を計算してみる。
400nHくらいらしい。こちらの計算結果だと、0.43uHなので、だいたい合ってそう。とすると、344pFで共振周波数が13.56MHzになり、ICの寄生容量は36pFなので、、、220pF+82pFでいってみる。
共振周波数は
って感じでだいたい13.87MHzでまぁまぁいい感じだが、共振周波数付近でポイントが粗いってことはちょっとQが高すぎる気がする。まぁまずは気にしない。
こんな感じ、
h=25mmまで通信できた。まぁいい感じでしょ。(続く)
2025年4月5日土曜日
2025年3月29日土曜日
NFCアンテナ(2)
実験用のNFCアンテナを作ってみる。のちのちPCB内層を利用することを考えて平面で。
アンテナを小さくしてみる。
実験用のNFCアンテナを作ってみる。のちのちPCB内層を利用することを考えて平面で。
アンテナを小さくしてみる。
前回、性能向上を進めるって書いたけど、すでに動くおっきいアンテナでやってもしょうがないなって考えが変わった。現場では無茶な要求に応えないといけないことの方が圧倒的に多いよね。
作ったのがこちら。内寸13mm×13mm。
それでは、こんな感じで動かしてみる。
そうすると、、、
はい。だめです。、、、いいんよ。これで。
では、アンテナの特性を測定してみる。測定方法はコイル(2)に書いてあるんだけど、今回は「反射法」で。理由はネットアナのキャリブレーションがメンドクサイから。
だいぶ雑だけど、こんな感じで、 nanovna-serverではこんな感じでになる。
測定結果をtouchstone(s1p)で保存する(測定結果を画像で保存する文化の会社があるけど、計測器の中はせっかく数字なんだからこの数字を取り出した方が価値あるよね)。1port S-parameterが保存されたわけなので、
で、Zを計算して、
ってすればいい。そうすると、こうなる。
ざっくり、560nHらしい。はじめての測定では測定が正しいのかどうかを何とかして検証する必要があるが、今回は計算してくれるwebサイトのお世話になる。こちら。
線材の太さ0.25mm/長方形で幅=13mm, 高さ=13mm/巻き数からインダクタンスを計算/巻き数4回
で計算ボタンを押すと、0.57uHってでる。おお、あってそうやん。
次は、タグICの寄生キャパシタンスを測定する。が、直接測定せずに、ICをつないだ状態で共振周波数を測定してみる。こんなかんじ。
で、nanovna-serverのマーカーで共振周波数を探す。共振周波数はリアクタンス=0となる周波数なので、スミスチャートで虚部=0の線と測定データが交わるポイントの周波数。
ということで、35.65MHzにいる。
560nHのコイルだと36pFで共振周波数が35.447MHzなので、ざっくり36pFの寄生容量ってことになる。
アンテナの共振周波数をとりあえず13.56MHzに近づけてみる(本当は13.56MHzは最適ではない)。560nHのコイルだと240pFで13.73MHzなので、150+47pFくらいでいっかな。
こんなかんじ
足つきのキャパシタなんて持ってないから1608をユニバーサルのきれっぱしに実装してICソケットを付けている。
測定結果はこんな感じ
共振周波数は13.87MHzでまぁまぁいい感じ。で、リーダーと通信してみる。こんな感じで通信できている。 まぁまぁいけてるので、こんな感じでもやってみた。h=30mm。これでも通信できる。
やるな「俺アンテナ」。が、ここまでは出来て当たり前なのだよ。世の中の要求はもっと厳しい。
3月は別れの季節。新たなチャレンジをする人。潮時を見極めた人。どんな形であれ決断して行動できる人は偉い。正解しかない。すべてうまくいく。そう信じてる。
アンテナを小さくしてみる。
実験用のNFCアンテナを作ってみる。のちのちPCB内層を利用することを考えて平面で。
アンテナを小さくしてみる。
前回、性能向上を進めるって書いたけど、すでに動くおっきいアンテナでやってもしょうがないなって考えが変わった。現場では無茶な要求に応えないといけないことの方が圧倒的に多いよね。
作ったのがこちら。内寸13mm×13mm。
それでは、こんな感じで動かしてみる。
そうすると、、、
はい。だめです。、、、いいんよ。これで。
では、アンテナの特性を測定してみる。測定方法はコイル(2)に書いてあるんだけど、今回は「反射法」で。理由はネットアナのキャリブレーションがメンドクサイから。
だいぶ雑だけど、こんな感じで、 nanovna-serverではこんな感じでになる。
測定結果をtouchstone(s1p)で保存する(測定結果を画像で保存する文化の会社があるけど、計測器の中はせっかく数字なんだからこの数字を取り出した方が価値あるよね)。1port S-parameterが保存されたわけなので、
ざっくり、560nHらしい。はじめての測定では測定が正しいのかどうかを何とかして検証する必要があるが、今回は計算してくれるwebサイトのお世話になる。こちら。
線材の太さ0.25mm/長方形で幅=13mm, 高さ=13mm/巻き数からインダクタンスを計算/巻き数4回
で計算ボタンを押すと、0.57uHってでる。おお、あってそうやん。
次は、タグICの寄生キャパシタンスを測定する。が、直接測定せずに、ICをつないだ状態で共振周波数を測定してみる。こんなかんじ。
で、nanovna-serverのマーカーで共振周波数を探す。共振周波数はリアクタンス=0となる周波数なので、スミスチャートで虚部=0の線と測定データが交わるポイントの周波数。
ということで、35.65MHzにいる。
560nHのコイルだと36pFで共振周波数が35.447MHzなので、ざっくり36pFの寄生容量ってことになる。
アンテナの共振周波数をとりあえず13.56MHzに近づけてみる(本当は13.56MHzは最適ではない)。560nHのコイルだと240pFで13.73MHzなので、150+47pFくらいでいっかな。
こんなかんじ
足つきのキャパシタなんて持ってないから1608をユニバーサルのきれっぱしに実装してICソケットを付けている。
測定結果はこんな感じ
共振周波数は13.87MHzでまぁまぁいい感じ。で、リーダーと通信してみる。こんな感じで通信できている。 まぁまぁいけてるので、こんな感じでもやってみた。h=30mm。これでも通信できる。
やるな「俺アンテナ」。が、ここまでは出来て当たり前なのだよ。世の中の要求はもっと厳しい。
3月は別れの季節。新たなチャレンジをする人。潮時を見極めた人。どんな形であれ決断して行動できる人は偉い。正解しかない。すべてうまくいく。そう信じてる。
2025年3月23日日曜日
NFCアンテナ(1)
実験用のNFCアンテナを作ってみる。のちのちPCB内層を利用することを考えて平面で。動くところまでやっつけたい。
実験用のNFCアンテナを作ってみる。のちのちPCB内層を利用することを考えて平面で。動くところまでやっつけたい。だいぶ(10年以上)昔にNFCを検討したときに買ったM24LR16E(STマイクロ)が我が家にある。M24LR16EはISO15693対応なのでそれを単にNFCと言っていいんか?って昔の人なら疑問を感じるけど、タグとしてはNFC Type-5 Tagに該当するらしい。まぁマイナーだね。が、今回はISO14443でやりたいので、STマイクロのM24SR02を購入した。マルツ(https://www.marutsu.co.jp/pc/i/27709926/)のデジキー部品取り寄せ。デジキーから直で購入するよりトータルで安くつく。で、なんでNXPじゃなくてSTマイクロ?そらーNXPはデータシートすらまともに公開してないからだよ。最近はSTマイクロもオフィシャルなメールアドレスで登録しないとソフトをダウンロードできないとか計算ツールを利用できないとか壁を高くしつつあるけど、なんでやろ。
リーダー側はちょっと前に購入したPN5180を使う。
では、アンテナを作る。
こんな感じで、クリアファイルにガムテープの粘着面が上になるように何とかして貼り付けて、そのガムテの粘着面に型紙を貼り付けて、その周りにエナメル線を巻いていく。今回はサイズはPN5180のアンテナと同じにして、4ターンにしておく。きれいに巻くのがなかなか難しい。若い頃は余裕だったのに。
で、巻き終わったら、上からセロテープを貼り付ける。線がはがれないようにってのと、ガムテの粘着面に手が着いてイラっとしないようにって目的がある。で、いい感じに周囲を切り取って完成。
次はICの方。変換基板はSunHayatoのSSP-201。表裏で違うフットプリントに対応しているってのと配線がぐるってしているのが正直気に食わないけど、まぁ我が家に今これしかなかったのでしょうがない。
で、データシート(https://www.st.com/content/ccc/resource/technical/document/datasheet/e2/ed/a5/4c/6b/42/46/91/DM00097458.pdf/files/DM00097458.pdf/jcr:content/translations/en.DM00097458.pdf)によると、
ってことらしいので、 まぁ、こうなる。で、性能を十分に引き出すにはAC0-AC1間に同調キャパシタを付けんといかんのだけど、まぁまずはこのままでまぁどんなもんかやってみる。
リーダー側は以前やったPN5180(NFC Frontend)を使ってみる(1)(https://sunday-engineer.jimdofree.com/2024/02/10/pn5180-nfc-frontend-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B-1/)を使う。<--そういえばこれ「(1)」なのに「(2)」はいまだに現れてないね╮(´•ω•)╭、、、まぁ気にしない。で、まぁこんな感じ。
で、とりあえず、動かしてみよう。こんな感じで、M24SR02につないだ自作アンテナをPN5180のアンテナにかぶせて、
で、ターミナルを見てみると、
こんな感じでUIDを読み取れたことがわかる。だいたい10mmくらい浮かせてもUIDを読み取れる。やるな「俺アンテナ」。この後、まずは、さらなる性能向上をめざす。
さて、まただいぶさぼった。やるべきことが多すぎてやる気が起きない。やりたいことが多すぎてどれにも手が付けられない。そんな時もあるさ。いや、先週着手してたんだけど、タグICが我が家に10年以上前に購入したM24LR16Eしかなくて、今回は諸事情によりISO15693ではなくISO14443でやりたかったので、M24SR02を改めて発注してたって訳だよ(言い訳)。
では、アンテナを作る。
こんな感じで、クリアファイルにガムテープの粘着面が上になるように何とかして貼り付けて、そのガムテの粘着面に型紙を貼り付けて、その周りにエナメル線を巻いていく。今回はサイズはPN5180のアンテナと同じにして、4ターンにしておく。きれいに巻くのがなかなか難しい。若い頃は余裕だったのに。
で、巻き終わったら、上からセロテープを貼り付ける。線がはがれないようにってのと、ガムテの粘着面に手が着いてイラっとしないようにって目的がある。で、いい感じに周囲を切り取って完成。
次はICの方。変換基板はSunHayatoのSSP-201。表裏で違うフットプリントに対応しているってのと配線がぐるってしているのが正直気に食わないけど、まぁ我が家に今これしかなかったのでしょうがない。
で、データシート(https://www.st.com/content/ccc/resource/technical/document/datasheet/e2/ed/a5/4c/6b/42/46/91/DM00097458.pdf/files/DM00097458.pdf/jcr:content/translations/en.DM00097458.pdf)によると、
ってことらしいので、 まぁ、こうなる。で、性能を十分に引き出すにはAC0-AC1間に同調キャパシタを付けんといかんのだけど、まぁまずはこのままでまぁどんなもんかやってみる。
リーダー側は以前やったPN5180(NFC Frontend)を使ってみる(1)(https://sunday-engineer.jimdofree.com/2024/02/10/pn5180-nfc-frontend-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B-1/)を使う。<--そういえばこれ「(1)」なのに「(2)」はいまだに現れてないね╮(´•ω•)╭、、、まぁ気にしない。で、まぁこんな感じ。
で、とりあえず、動かしてみよう。こんな感じで、M24SR02につないだ自作アンテナをPN5180のアンテナにかぶせて、
で、ターミナルを見てみると、
こんな感じでUIDを読み取れたことがわかる。だいたい10mmくらい浮かせてもUIDを読み取れる。やるな「俺アンテナ」。この後、まずは、さらなる性能向上をめざす。
さて、まただいぶさぼった。やるべきことが多すぎてやる気が起きない。やりたいことが多すぎてどれにも手が付けられない。そんな時もあるさ。いや、先週着手してたんだけど、タグICが我が家に10年以上前に購入したM24LR16Eしかなくて、今回は諸事情によりISO15693ではなくISO14443でやりたかったので、M24SR02を改めて発注してたって訳だよ(言い訳)。
2025年2月17日月曜日
32bit DLLを64bitアプリから使う(決定版)
32bit DLLを64bitアプリからcallすることはできません(ちなみに逆もできません)。需要はあるけど面倒なこの課題に取り組む。
これみてちょ。
Go言語入門(12)
RPC serverを作る。彼は32bit Windows実行ファイルであり、32bit Windows DLLを使って何か計算する。RPC clientを作る。彼はRPC serverを起動してそこから結果を取得できる。ちょっと前まで64bit Windows実行ファイルだったけど64bit DLLになろうとしている。
もはやGo言語そっちのけ感があるけど、やりたかったことの終着点が来た。それは過去に取り組んだこちら(32bit DLLを64bitアプリから使う)をsocketに代えてRPCでやるって取り組みだったわけだよ、、、で具体的な構造はこんな感じ(以前と同じだけど32bitと64bitの間がsocketからgRPCになってる)
で、client以外は前回(Go言語入門(11))と全くおんなじ。
proto/grpctry4.proto
一旦、
(後回しにするとよく忘れちゃうから)
server/main.go
で、clientだが、前回、関数化するってことまでやってたので、コメントでexportするってのとmainの中身をコメント化するってことだけ。で、
で、-buildmode=c-sharedを付けてbuildすればいいんだけど、オプションがめっちゃ長いので、Makefileを作っちゃう。何度もやり直す羽目になった時用。
client/Makefile
で、
うまくいくはず。
でclientのDLLを呼び出す実行ファイルを作成する。これはC言語でいかせてください。こんなかんじ。
grpctry4_test_64.c
で、コンパイルする。
で、こうなる。
で、実行。
すごいぞ。64bitアプリから32bitDLLを呼び出せているように見える。Go言語使うってことを除けばsocketよりも全然簡単。C++でもC#でもできるんだろうけどGo言語の方がたぶん簡単。
もはやGo言語そっちのけ感があるけど、やりたかったことの終着点が来た。それは過去に取り組んだこちら(32bit DLLを64bitアプリから使う)をsocketに代えてRPCでやるって取り組みだったわけだよ、、、で具体的な構造はこんな感じ(以前と同じだけど32bitと64bitの間がsocketからgRPCになってる)
で、client以外は前回(Go言語入門(11))と全くおんなじ。
PATH="$PATH:$HOME/go/bin"
mkdir grpctry4
cd grpctry4
mkdir proto
mkdir server
mkdir client
go mod init grpc/grpctry4
proto/grpctry4.proto
- syntax = "proto3";
- package grpctry4;
- option go_package = "./proto";
- service MyAESEncrypter {
- rpc AESEncrypt (Plain_and_Key) returns (Cipher) {}
- }
-
- message Plain_and_Key {
- bytes plain=1;
- bytes key=2;
- }
-
- message Cipher {
- bytes result=1;
- }
protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative proto/grpctry4.proto
go get google.golang.org/grpc
(後回しにするとよく忘れちゃうから)
server/main.go
- package main
-
- import (
- "context"
- "flag"
- "fmt"
- "log"
- "net"
- "syscall"
- "unsafe"
-
- pb "grpc/grpctry4/proto"
-
- "google.golang.org/grpc"
- )
-
- var (
- hdll, _ = syscall.LoadLibrary("rijndael.dll")
- aes128encrypt, _ = syscall.GetProcAddress(hdll, "AES128Encrypt")
- aes128decrypt, _ = syscall.GetProcAddress(hdll, "AES128Decrypt")
- )
-
- func AES128Encrypt(plain *uint8, key *uint8, crypted *uint8) (r uint32) {
- var nargs uintptr = 3
- ret, _, _ := syscall.Syscall9(uintptr(aes128encrypt),
- nargs,
- uintptr(unsafe.Pointer(plain)),
- uintptr(unsafe.Pointer(key)),
- uintptr(unsafe.Pointer(crypted)),
- 0, 0, 0, 0, 0, 0)
- r = uint32(ret)
- return
- }
- func AES128Decrypt(crypted *uint8, key *uint8, plain *uint8) (r uint32) {
- var nargs uintptr = 3
- ret, _, _ := syscall.Syscall9(uintptr(aes128decrypt),
- nargs,
- uintptr(unsafe.Pointer(crypted)),
- uintptr(unsafe.Pointer(key)),
- uintptr(unsafe.Pointer(plain)),
- 0, 0, 0, 0, 0, 0)
- r = uint32(ret)
- return
- }
-
- var (
- port = flag.Int("port", 50051, "The server port")
- )
-
- type server struct {
- pb.UnimplementedMyAESEncrypterServer
- }
-
- func (s *server) AESEncrypt(_ context.Context, in *pb.PlainAnd_Key) (*pb.Cipher, error) {
- var d1 []byte = in.GetPlain()
- var d2 []byte = in.GetKey()
- var d1arr [16]byte = *(*[16]byte)(d1[:16])
- var d2arr [16]byte = *(*[16]byte)(d2[:16])
- var d3arr [16]byte
- //defer syscall.FreeLibrary(hdll)
- AES128Encrypt(&d1arr[0], &d2arr[0], &d3arr[0])
- return &pb.Cipher{Result: d3arr[:]}, nil
- }
- func main() {
- flag.Parse()
- lis, err := net.Listen("tcp", fmt.Sprintf(":%d", *port))
- if err != nil {
- log.Fatalf("failed to listen: %v", err)
- }
- s := grpc.NewServer()
- pb.RegisterMyAESEncrypterServer(s, &server{})
- log.Printf("server listening at %v", lis.Addr())
- if err := s.Serve(lis); err != nil {
- log.Fatalf("failed to serve: %v", err)
- }
- defer syscall.FreeLibrary(hdll)
- }
cd server
GOOS=windows GOARCH=386 go build -o ../grpctry4_server.exe main.go
cd ..
で、clientだが、前回、関数化するってことまでやってたので、コメントでexportするってのとmainの中身をコメント化するってことだけ。で、
- package main
-
- /*
- #include <stdint.h>
- */
- import "C"
-
- import (
- "context"
- "flag"
- "fmt"
- "log"
- "os/exec"
- "time"
- "unsafe"
-
- pb "grpc/grpctry4/proto"
-
- "google.golang.org/grpc"
- "google.golang.org/grpc/credentials/insecure"
- )
-
- var (
- addr = flag.String("addr", "localhost:50051", "the address to connect to")
- )
- var cmd *exec.Cmd
-
- func init() {
- srv_start_cmd := "./grpctry4_server.exe"
- src_start_arg := ""
- cmd = exec.Command(srv_start_cmd, src_start_arg)
- cmd.Start()
- fmt.Println(cmd.Process.Pid)
- }
-
- type arr16 struct {
- v [16]C.uint8_t
- }
-
- //export AES128Encrypt
- func AES128Encrypt(cp *C.uint8_t, ck *C.uint8_t, cc *C.uint8_t) {
- acp := (*arr16)(unsafe.Pointer(cp))
- ack := (*arr16)(unsafe.Pointer(ck))
- acc := (*arr16)(unsafe.Pointer(cc))
- ppp := []byte{}
- kkk := []byte{}
- ccc := []byte{}
- for i := 0; i < 16; i++ {
- ppp = append(ppp, (uint8)((*acp).v[i]))
- kkk = append(kkk, (uint8)((*ack).v[i]))
- }
- defer cmd.Process.Kill()
- // Set up a connection to the server.
- dialOpts := []grpc.DialOption{
- grpc.WithTransportCredentials(insecure.NewCredentials()),
- grpc.WithDefaultCallOptions(grpc.WaitForReady(true)),
- }
- conn, err := grpc.NewClient(*addr, dialOpts...)
- if err != nil {
- log.Fatalf("did not connect: %v", err)
- }
- defer conn.Close()
- c := pb.NewMyAESEncrypterClient(conn)
- // Contact the server and print out its response.
- ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
- defer cancel()
- r, err := c.AESEncrypt(ctx, &pb.PlainAnd_Key{Plain: ppp, Key: kkk})
- if err != nil {
- log.Fatalf("could not greet: %v", err)
- }
- ccc = r.GetResult()
- for i := 0; i < 16; i++ {
- (*acc).v[i] = (C.uint8_t)(ccc[i])
- }
- }
- func main() {
- /*
- p := [...]C.uint8_t{0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff}
- k := [...]C.uint8_t{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}
- c := [...]C.uint8_t{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
- fmt.Printf("% 02X\n", p)
- fmt.Printf("% 02X\n", k)
- AES128Encrypt_grpcexec(&p[0], &k[0], &c[0])
- fmt.Printf("% 02X\n", c)
- */
- }
で、-buildmode=c-sharedを付けてbuildすればいいんだけど、オプションがめっちゃ長いので、Makefileを作っちゃう。何度もやり直す羽目になった時用。
client/Makefile
- OPT_CC= CC=x86_64-w64-mingw32-gcc
- #OPT_CC= CC=i686-w64-mingw32-gcc
- OPT_CGO= CGO_ENABLED=1
- OPT_OS= GOOS=windows
- OPT_ARCH= GOARCH=amd64
- #OPT_ARCH= GOARCH=386
- GOFLAGS=build -buildmode=c-shared
- #GOFLAGS=build -ldflags "-s -w" -buildmode=c-shared
- GO=go
- #SRCS=dll64wdllmain.go dllmain.go
- SRCS=main.go
- TARGET=../grpctry4_client.dll
-
- $(TARGET) : $(SRCS)
- $(OPT_CC) $(OPT_CGO) $(OPT_OS) $(OPT_ARCH) $(GO) $(GOFLAGS) -o $(TARGET) $(SRCS)
-
- clean :
- rm $(TARGET)
cd client
make
うまくいくはず。
cd ..
でclientのDLLを呼び出す実行ファイルを作成する。これはC言語でいかせてください。こんなかんじ。
grpctry4_test_64.c
- #include <stdio.h>
- #include <stdint.h>
- #include <windows.h>
- typedef int (__stdcall *AES128Encrypt_type)(uint8_t* a,uint8_t* b,uint8_t* c);
- HMODULE dll;
- AES128Encrypt_type AES128Encrypt;
-
- int main(int argc,char** argv){
- int r,i;
- uint8_t aa[16]={0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff};
- uint8_t bb[16]={0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f};
- uint8_t cc[16]={0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
- dll=LoadLibrary("grpctry4_client.dll");
- AES128Encrypt=(AES128Encrypt_type)GetProcAddress(dll,"AES128Encrypt");
- for(i=0;i<16;i++){
- printf("%02x",aa[i]);
- }
- printf("\n");
- for(i=0;i<16;i++){
- printf("%02x",bb[i]);
- }
- printf("\n");
- r=AES128Encrypt(aa,bb,cc);
- for(i=0;i<16;i++){
- printf("%02x",cc[i]);
- }
- printf("\n");
- return 0;
- }
x86_64-w64-mingw32-gcc grpctry4_test_64.c
で、こうなる。
- .
- ├── a.exe
- ├── client
- │ ├── Makefile
- │ ├── dllmain.h
- │ └── main.go
- ├── go.mod
- ├── go.sum
- ├── grpctry4_client.dll
- ├── grpctry4_client.h
- ├── grpctry4_server.exe
- ├── grpctry4_test_64.c
- ├── proto
- │ ├── grpctry4.pb.go
- │ ├── grpctry4.proto
- │ └── grpctry4_grpc.pb.go
- ├── rijndael.dll
- └── server
- └── main.go
で、実行。
./a.exe
すごいぞ。64bitアプリから32bitDLLを呼び出せているように見える。Go言語使うってことを除けばsocketよりも全然簡単。C++でもC#でもできるんだろうけどGo言語の方がたぶん簡単。
登録:
投稿 (Atom)