こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

OpenSSLでOPENSSL_Applinkが見つからない。

WindowsXPでOpenSSL(ver 0.9.8.h)を使用したDLLを作成しています。

PEMファイルを読み込むためにPEM_read_RSA_PUBKEY、PEM_read_RSAPrivateKeyを使用したいのですが、PEM_readRSA_PUBKEY、PEM_read_RSAPrivateKey部分で、

OEPNSSL_Uplink(04847010,05):no OPENSSL_Applinkというエラーが出てしまいます。

通常プロジェクトですとうまくいくのですが、DLLにしてExcelVBAで動作させると上のエラーが発生してしまいます。

エラー箇所だと思われるソースコード(uplink.c)を見ると

applink=(void**(*)())GetProcAddress(h,"OPENSSL_Applink");
if (applink==NULL)
{apphandle=(HMODULE)-1;
_tcscpy (msg+len,_T("no OPENSSL_Applink"));
break;
}

の箇所でapplinkがNULLのためエラーになってしまっているようです。

作成したDLLをコマンド[dumpbin /EXPORTS 自作DLL]で見ると実行させたい関数と、OPENSSL_Applink関数が表示されます。
(序数ではなく、_OPENSSL_Applinkで表示されます。)

原因がわかる方いらっしゃいますでしょうか?

よろしくお願い致します。

OS:WindowsXP
OpenSSL:0.9.8.h
Excel:2002

投稿日時 - 2008-07-22 09:51:49

QNo.4195036

すぐに回答ほしいです

質問者が選んだベストアンサー

uplink.c を読んでみましたが、
おそらくは直前の GetModuleHandle(NULL) によって
DLL の呼び出し元の方が関数の検索対象になっているのですね。
ここを DLL 名に変えてコンパイルし直せば大丈夫かもしれませんが……。

また、ドキュメントを検索したところ以下のようなやり取りが見つかりました。
たぶん、FILE* を引数に取る関数を避けて IO 周りを自分で実装するように、
ということだと思いますが、結構な手間が掛かると思います。
もし速度がそれほど重要な局面でなければ、
DLL からコマンドを呼び出すようにした方が楽で無難かもしれません。

参考URL:http://archive.netbsd.se/?ml=openssl-dev&a=2005-12&t=1552483

投稿日時 - 2008-07-24 02:11:24

補足

>おそらくは直前の GetModuleHandle(NULL) によって
>DLL の呼び出し元の方が関数の検索対象になっているのですね。
>ここを DLL 名に変えてコンパイルし直せば大丈夫かもしれませんが……。

ExcelVBA側でOPENSSL_Applink関数が利用できる状態(Declare Function ~)にしてみたのですが
ダメだったのでやはり再コンパイルするしか無いんでしょうね^^;


>また、ドキュメントを検索したところ以下のようなやり取りが見つかりました。
>たぶん、FILE* を引数に取る関数を避けて IO 周りを自分で実装するように、
>ということだと思いますが、結構な手間が掛かると思います。

あまり時間が無いので後回しにさせていただきます;


>もし速度がそれほど重要な局面でなければ、
>DLL からコマンドを呼び出すようにした方が楽で無難かもしれません。

これも考えたのですが、クライアント側にOpenSSLのインストールができないため断念しました。

再コンパイルでがんばってみます。

投稿日時 - 2008-07-24 09:43:53

お礼

よくよく調べたらGetModuleHandle(NULL)は起動プロセスのハンドルを返すのでやはりVBAからでは無理そうでした。

DLL → EXE → DLLの形でもいけそうです。
(実際にやってないので断言はできませんが^^;)

ソースを変更して再コンパイルが一番妥当だと思いました。

ありがとうございました。

投稿日時 - 2008-07-24 23:54:14

このQ&Aは役に立ちましたか?

18人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

openssl/applink.c
をインクルードしてもその現象は見られますか?

投稿日時 - 2008-07-22 22:19:58

補足

回答ありがとうございます。

openssl/applink.cはインクルードしています。

コンソール用に作成した(__declspec(dllexport)をはずしたり)ものなら動作するんです;

投稿日時 - 2008-07-23 08:44:29

あなたにオススメの質問