ここから質問投稿すると、最大10000ポイント当たる!!!! >>

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

このQ&Aに関連する最新のQ&A

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に関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qファイルやディレクトリの存在確認を行う方法

ファイルをオープンするのはfopenでOKですが、ファイルやディレクトリの存在確認を行う方法が知りたいです。

何か組み合わせて作るものなのでしょうか?
perlとか便利な演算子があるのですが、C/C++って器用ではないですね。
これは処理系?依存の内容ですか?

私の環境は VC6, VC2005 Windows2000です。

Aベストアンサー

int access(const char* path, int mode);
int stat(const char* path, struct stat* sb);

かな?
MSDN を引くと _access_s() を使えとか書いてあるけど。

Qメモリの再確保について

テキストファイルを読込む関数を作成しています。
まず最初にある程度の領域をmalloc()関数で確保し、
読み込む過程で領域が不足すると再割り当てを
行うようにしたいのですが、
エラーが出力されます。
ソース(エラー処理は省略)は次の通りです。

textdata = (char *) malloc (size * sizeof (char));

for (i = 0; !feof (stream); ) {
character = fgetc (stream);
textdata[i] = character;
i++;

if ((i % size) == 0) {
temp = (char *) malloc (2 * size * sizeof (char));
memcpy (temp, textdata, size * sizeof (char));
free (textdata);
textdata = temp;
}
}

出力されるエラーは次の通りです。

*** glibc detected *** ./lsm: malloc(): memory corruption (fast): 0x09a34198 ***
(省略)
アボートしました

どなたか解決方法を御指導願います。

テキストファイルを読込む関数を作成しています。
まず最初にある程度の領域をmalloc()関数で確保し、
読み込む過程で領域が不足すると再割り当てを
行うようにしたいのですが、
エラーが出力されます。
ソース(エラー処理は省略)は次の通りです。

textdata = (char *) malloc (size * sizeof (char));

for (i = 0; !feof (stream); ) {
character = fgetc (stream);
textdata[i] = character;
i++;

if ((i % size) == 0) {
temp = (char *) malloc (2 * size * sizeof...続きを読む

Aベストアンサー

memcpy以降でsizeを二倍してください。
いまのままだと、常にsizeの初期値*2のメモリしか確保されませんので、sizeの初期値*2以上読み込もうとするとメモリ破壊が起きてしまいます。

QVC++から引数付きexeファイルの実行

タイトルの通り、VC++から外部ファイルを実行したいのですがどのような関数を使えばよいのでしょうか?
exeファイルを実行中は親プロセスであるVCのプログラムの方を止めておきたいのです。
出来ればexeファイルは引数付きで実行したいと思いますので、よろしくお願いします。
開発環境はVisualStudio2005です。

Aベストアンサー

#1です。こちらで作成したサンプルです。
呼び出し側
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
intret;
printf("system試験開始\n");
ret = system("C:\\VCSTUDY\\printarg\\Debug\\printarg.exe XXX YYY ZZZ");
if (ret == 0){
printf("system成功\n");
}else{
printf("system失敗\n");
}
return 0;
}
----------------------

呼び出される側(c:\\test.exeに相当)
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
inti;
for (i = 0; i < argc; i++){
printf("ARGV[%d]=%s\n",i,argv[i]);
}
return 0;
}
以下、実行結果です。
コマンドプロンプト画面に下記の文字が出力されます。
------------------------
system試験開始
ARGV[0]=C:\VCSTUDY\printarg\Debug\printarg.exe
ARGV[1]=XXX
ARGV[2]=YYY
ARGV[3]=ZZZ
system成功
Press any key to continue
---------------------------

#1です。こちらで作成したサンプルです。
呼び出し側
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
intret;
printf("system試験開始\n");
ret = system("C:\\VCSTUDY\\printarg\\Debug\\printarg.exe XXX YYY ZZZ");
if (ret == 0){
printf("system成功\n");
}else{
printf("system失敗\n");
}
return 0;
}
----------------------

呼び出される側(c:\\test.exeに相当)
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
inti;
for (i = 0; i < argc; i++){
p...続きを読む


人気Q&Aランキング