プロが教える店舗&オフィスのセキュリティ対策術

C++プログラムの初級者です。

EXE1の数値をDLLの関数Func1に渡し、そこで計算した結果を関数Func2でEXE2に送るプログラムを作成しています。

下記のようなDLLのコードを作成したのですが、うまく数値を受け渡すことが出来ません。

調べてみると、EXE1⇔DLLとEXE2⇔DLLとは、アドレス空間が別なので、DLLのStatic変数を共有できないようです。

EXE1⇔DLL と EXE2⇔DLL の1対1では数値受け渡しは、正常に動作しています。

具体的に、DLLにどのようなコードを書けば、数値を受け渡すことができるのでしょうか?

ご指導よろしくお願いします。

VC++2010ExpressEdition で作成しています。


<DLLのソースコード>
----------------------
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>


static double aa, bb;


__declspec(dllexport) double __stdcall Func1(double a1, double b1)
{
aa = a1*2;

return (double)(aa);
}

__declspec(dllexport) double __stdcall Func2(double a2, double b2)
{
return (double)(aa);
}


BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
{
//----
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
//----
return(TRUE);
}

A 回答 (4件)

EXE1⇔DLL 



EXE2⇔DLL

と表現されていますが、 EXE1 で DLL の機能を使用した時点で、 EXE1⇔DLL は、
EXE1 になってしまいます。 ( ※ EXE2 も同様 )

したがって、EXE1 と EXE2 とで 情報を受け渡す方法を考える必要があります。
    • good
    • 0
この回答へのお礼

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

DLL⇔EXE2 のEXE2は、Windowsではなくて特殊なソフトで、変更することはできません。
これは、DLLのFunc2と通信をしています。

DLLとEXE1は変更できます。これらは共にVC+2010で作成しました。

ですので、EXE1とEXE2で情報を受け渡すことはできません。

何かよい案はないでしょうか?

お礼日時:2012/02/29 17:01

EXE1とEXE2で情報を受け渡すのとdllは全く無関係です。

dllはプロセスごとのメモリ空間を持ちますので情報をプロセス間で共有できません。

情報の受け渡しは、プロセス間通信とか共有メモリなどの領分ですね。この処理にはdllは必要ありません。
    • good
    • 0
この回答へのお礼

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

ご指摘の内容をようやく理解することができました。

そうすると、EXE1とDLLの内容を書き換えて、EXR1→EXE2に数値を送るためには、どのようなコードを書けばよいのでしょうか?

教えて頂ければ幸いです。

お礼日時:2012/02/29 17:29

補足を見ました。


dllでプロセス間共有メモリを生成して、func1とfunc2で共有メモリを参照、書き換えすれば出来ます。1つの数値ぐらいなら複雑な制御はいらないでしょう。
Windowsでは、CreateFileMappingで作成します。

「ファイルマッピング」
http://wisdom.sakura.ne.jp/system/winapi/win32/w …

この回答への補足

ようやく、解決することができました。

#pragma data_seg ディレクティブを用いると、簡単に共有メモリーを使うことができます。

私がアップしたDLLのコードの

static double aa, bb;

の代わりに、

#pragma data_seg(".MYSEC")
int iSharedVar = 0;
#pragma data_seg()

と書きます。

そして、DLLのDEFファイルに

SECTIONS

.MYSEC READ WRITE SHARED

を追加するだけで、

iSharedVar  の値をDLLの関数で自由に共有でき、
それを複数のEXEファイルで利用できます。

ああ、長時間かかった課題が解決できて、うれしいいいい!!!

私と同じような課題を抱えた方のご参考になれば嬉しいです。

補足日時:2012/03/01 01:21
    • good
    • 2
この回答へのお礼

ファイルマッピングで作成する方法を教えて頂き
誠にありがとうございます。

早速、取り掛かってみます。

時間がかかりそうなので、まずはお礼をさせて頂きます。
ありがとうございました。

お礼日時:2012/02/29 18:48

#pragma data_seg を使用すればできそうな気がします。

(確認はしてませんが。)

DLL 内のデータをアプリケーションまたはほかの DLL と共有する方法
http://msdn.microsoft.com/ja-jp/library/h90dkhs0 …
    • good
    • 0
この回答へのお礼

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

この掲示板を見る前に、同じ方法を見つけまして、それを下の欄に記入しました。

お知らせありがとうございました。

お礼日時:2012/03/01 02:16

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