Cのfree関数をつかうには?

解決


Me  2006-08-06 11:35:06  No: 96178

質問ばかりで申し訳ありません。
VBAでC言語のfree関数を使いたいのですが、
free関数のあるDLLを見つけられません。

どうすれば使えるのかご存知でしたら教えていただけないでしょうか?
(sizeofも・・・必須ではないですが使いたいです。)


Me  2006-08-06 12:07:59  No: 96179

もっと具体的にいいますと・・
getaddrinfoでIPアドレスを取得したいのですが、
取得したaddrinfoを開放する関数freeaddrinfoが、マシンがWin2000なのでありません。

Cで作る場合は下記からws2api.hをダウンロードしてインクルードすればいい
http://msdn.microsoft.com/downloads/sdks/platform/tpipv6.asp
のですが、VBAの場合は自作するしかありません。

ws2api.h内のWspiapiLegacyFreeAddrInfoをつくればいいわけですが、
#define WspiapiFree(p)          free(p)
と定義されているfree関数さえVBAから使えればいいのです。よろしくお願いいたします。


ガッ  2006-08-06 18:03:35  No: 96180

なんかややこしそうですね:
http://sylpheed.good-day.net/diary/?date=20060131

※2kないのでこれ以上は不明(orz


K.J.K.  2006-08-06 19:03:47  No: 96181

そもそも、Windows 2000には"getaddrinfo"も無いのでは。
ある環境ならば、"ws2_32.dll"に"freeaddrinfo"も一緒にあるはず。


ガッ  2006-08-06 20:37:43  No: 96182

どうやらIPv6は2kで追加のwinsockヘルパライブラリとして提供されていたようです
他にも、Cで自作していたり(ry
http://projects.commandprompt.com/public/pgsql/browser/trunk/pgsql/src/port/getaddrinfo.c
bccなど無料のCもあることですし、頑張ればそれなりのものが出来るのではないかと思います。

…getaddrinfo()なんて色々ラップしているだけと聞きますしね。


Me  2006-08-07 09:13:43  No: 96183

>K.J.K. 様
>"ws2_32.dll"に"freeaddrinfo"も一緒にあるはず。

それがないのです。dumpbin /exports コマンドで確認済みです。
下記のページにあるように、
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/debug/base/system_error_codes.asp

ws2_32.dllにfreeaddrinfo関数が加わったのはXp以降です。
このページにWspiapi.hを使えとあります。で、2番目の発言のリンクからダウンロードできるようになっているんです。

>ガッ様
いろいろ調べていただいてありがとうございます。

あれからいろいろ考えたのですが、freeaddrinfo関数は単に変数をfreeしているだけなので、free関数をつかわなくてもVBAの変数をaddrinfo構造体の数だけ宣言して代入しておけば、VBAの関数を抜けるときに勝手に開放してくれるのでは・・・???
(ポインタ変数の内容取得にはRtlMoveMemoryを使っています。)

確認するプログラムをつくってみます・・・


ガッ  2006-08-07 09:47:58  No: 96184

あ、うーん…コレをおいていっていいものやら…
とりあえず、何かの参考(もしくは罠)に成りそうなのでおいておきますね:
http://homepage1.nifty.com/kazubon/progdoc/tclock/nodeflib.html

とりあえず…
Cのmalloc()とfree()の内部実装がどうなってるか分かっていれば、
上のURLは参考になるかもしれません。
※9x系、NT系、XP系とそれぞれ違うかもしれない

が、当初の質問の内容である
> free関数のあるDLLを見つけられません。
という着眼を持ち続けているのならば、危ない雰囲気がプンプンします。
※cがDLLを中心とする体系になってる…ならば話は別ですが

まとまりがないですが、これ以上は危険なので足元だけはしっかり見て動いてください。
また、getaddrinfo()を使わない方針も考えてみてはどうでしょうか?


Me  2006-08-07 12:47:22  No: 96185

>K.J.K. 様
>そもそも、Windows 2000には"getaddrinfo"も無いのでは。

ほんとですね!!Ws2_32.dllの中にgetaddrinfoがありませんでした。
でもMingwでコンパイルできたんですけど・・
(実は、C言語でつくったものをVBAで書き直してるんです。)
もしかしてMingwのおせっかいでしょうか?

>ガッ様
情報ありがとうございます。
でもそれ以前の問題でくじけそう・・
とりあえずgetaddrinfoを探してみます


Me  2006-08-07 13:56:28  No: 96186

ようやく分かってきました。
getaddrinfoはwspiapi.hの中のWspiapiLegacyGetAddrInfoという関数で
代用していたみたいです。

結局これをVBAに書き直さないといけないなんて・・めんどくさーい!


Me  2006-08-07 19:38:17  No: 96187

getaddrinfo関数は結局なかったので、
gethostbyname()関数をつかってIPアドレスを取得できました。

free関数、使わずにすみました。ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加