アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (2件)

uplink.c を読んでみましたが、


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

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

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

この回答への補足

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

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


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

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


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

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

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

補足日時:2008/07/24 09:43
    • good
    • 0
この回答へのお礼

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

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

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

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

お礼日時:2008/07/24 23:54

openssl/applink.c


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

この回答への補足

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

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

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

補足日時:2008/07/23 08:44
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!