• 締切済み

DLL共用セクションの質問です

初歩的な質問で申し訳ありませんが、色々調べましたが分かりません ご指導願います Aと名づけたDLLの中で共用セクションを作りました #pragma data_seg("Shared") DWORD Adata = 0; -------(1)   #pragma data_seg() #pragma comment(linker, "/Section:Shared,rws") また別に作ったBと言うDLLの中でも共用セクションを作りました #pragma data_seg("Shared") DWORD Bdata = 0; -------(2)   #pragma data_seg() #pragma comment(linker, "/Section:Shared,rws") 質問1  AとBのDLLを同時に使用した場合、(1)と(2)のAdata、Bdataは全く同じ領域を示すのでしょうか? それとも互いに独立した領域なのでしょうか? 質問2  同じ領域であるとの前提で質問を続けます こちらが共用セクションを使用している際に、第三者がCと言うDLLを作り #pragma data_seg("Shared") DWORD Cdata = 0; -------(3)   #pragma data_seg() #pragma comment(linker, "/Section:Shared,rws") として Cdata = 100; などとしたらAdata、Bdataの内容が当方の関知しないうちに変更されてしまいます これを避けるにはどの様な手段がありますか? 宜しくご指導お願い申し上げます

みんなの回答

  • davidfox
  • ベストアンサー率58% (21/36)
回答No.1

>...色々調べましたが分かりません ... やってみれば、それが正しい結果だと思いますよ。 前提で質問を続けても誰も答える気になれないと思う。

sato-may
質問者

お礼

ご回答ありがとう

関連するQ&A

  • DLLの共有メモリと排他処理???

    共有メモリを持つDLLを作りました 機能は単純です (1)カウンターをアップしてその値を返す ⇒ CountUp() (2)カウンターの現在値を返す ⇒ TotalCount() #pragma data_seg(".HShared") static int m = 0; #pragma data_seg() #pragma comment(linker,"/Section:.HShared,rws") int WINAPI DllMain(HINSTANCE hInst, DWORD fdwReason, PVOID pvReserved) { return TRUE; } EXPORT int CALLBACK CountUP() { m++; return m; } EXPORT int CALLBACK TotalCount() { return m; } このDLLは多数のアプリから呼ばれます 当然同時に呼ばれることもあるでしょう カウンター m には排他処理を施してありません 大丈夫でしょうか? それとも排他は Windows様 がしてくれているのでしょうか? 色々と調べてみましたが良く分かりません 宜しくご教授お願い申し上げます

  • LINK : warning LNK4039: section '.myhook' specified with /SECTION option does not exist

    グローバルフックをすべく、他プロセスのクラス名の取得方法を考えているのですが、途中でつまづいてしまいました。 タイトルのように、 LINK : warning LNK4039: section '.myhook' specified with /SECTION option does not exist というエラーがでて先へ進めません。 以下にやったことを書きます。 //thedll.c #include <windows.h> #pragma comment(linker, "/SECTION:.myhook,RWS") #pragma data_seg() static CHAR buff[1024]; #pragma data_seg() BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { return TRUE; } //hWndFromウィンドウの1つ下のウィンドウのクラス名取得 CHAR *GetNextWndClassName(HWND hWndFrom) { HWND hWndNext; hWndNext = GetWindow(hWndFrom, GW_HWNDNEXT); GetClassName(hWndNext, buff, sizeof(buff) -1); return buff; } //thedll.def LIBRARY thedll EXPORTS GetNextWndClassName @1 SECTIONS .myhook READ WRITE SHARED これを以下のコマンドでコンパイル cl /LD thedll.c kernel32.lib user32.lib gdi32.lib /DEF:thedll.def エラーの内容は、.myhookセクションがないというようなものですが、、、DEFファイルがいけないのか、はたまた#pragma宣言に問題があるのか。 ご指摘おねがいします。

  • VC++&グローバルフックについて質問です

    vc++2008,Windows Vistaの環境でプログラムを作成しています。 以下、aが押されたら、設定したhWndにWM_KEYDOWN,VK_LEFTのメッセージを送るプログラムのつもりで書きました。 http://www.shos.info/develop/cwin/tipswin.html#windows008 を参考にしています。 しかし、dllにしてWinMainで呼び出したのですが動作しません。 エラーも出ないのでなぜ動かないのかがわかりません。 このプログラムをちゃんと動かすにはどうしたらいいでしょうか。 どうかご指摘ください。よろしくお願いします。 //hook.h #ifdef HOOKAPI #else #define HOOKAPI extern "C" __declspec(dllimport) #endif HOOKAPI HINSTANCE _hInstance; HOOKAPI HHOOK _hHook; HOOKAPI HWND _hWnd; HOOKAPI BOOL Set(HWND hWnd); HOOKAPI void Reset(); //hook.cpp #include <windows.h> #define HOOKAPI extern "C" __declspec(dllexport) #include "hook.h" #pragma data_seg(".share") HHOOK _hHook = NULL; HWND _hWnd = NULL; HINSTANCE _hInstance; #pragma data_seg() #pragma comment(linker, "/section:.share,rws") LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam) { /* ここでは 'A' が押されたら予め設定済みの _hWnd にメッセージを送る */ if (nCode >= 0 && nCode != HC_NOREMOVE && wParam == 'A') { PostMessage(_hWnd, WM_KEYDOWN, VK_LEFT, 0); CallNextHookEx(_hHook, nCode, wParam, lParam); return 1; } return CallNextHookEx(_hHook, nCode, wParam, lParam); } BOOL Set(HWND hWnd) { /* キーのフック */ _hHook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)HookProc, _hInstance, 0); /* ここで hInstance は DLL のインスタンス ハンドル */ _hWnd = hWnd; return (_hHook != NULL); } void Reset() { if (_hHook != NULL) { UnhookWindowsHookEx(_hHook); _hHook = NULL; } }

  • メモリのセクションに関して

    こんばんは。 表題の通り、セクション領域に関して3点ほどご質問が御座います。 (1)グローバル変数は、  ・0でない初期化を行う→.dataセクション  ・0で初期化、または、初期化なし→.bssセクション  上記のようにメモリに配置されると思いますが、  上記をstatic宣言した場合でも結果は同じでしょうか?  (static宣言したグローバル変数) (2)スタック、ヒープそれぞれが属するセクションは、それぞれ専用の  スタックセクション、ヒープセクションという名のセクションがあるという認識であっていますでしょうか?  (.dataでもなく、.bssでもなく、.textでもなく、.rodataでもなく。。。) (3)プログラム中に宣言した変数名や、そのアドレスを使用して、属しているセクションを確認することが出来る方法はありますでしょうか? どうかご教授をお願い致します。

  • C++でdllの呼び出しについて

    使用環境はVisualStudio2008、WindowsXPです。 http://www.voidtools.com/Everything-SDK.zip こちらのSDKに添付されているdllを呼び出したいと思います。 dll、lib、ヘッダーファイルをプロジェクトと同じフォルダに入れて以下のようなコードを書いてみたのですが、リンカエラーになりました。 #pragma comment(lib, "everything.lib") void __stdcall Everything_SetSearch(LPCTSTR lpString); void main(void){ Everything_SetSearch(L"ああ"); } ビルドエラーの内容 error LNK2019: 未解決の外部シンボル "void __stdcall Everything_SetSearch(wchar_t const *)" (?Everything_SetSearch@@YGXPB_W@Z) が関数 _main で参照されました。 fatal error LNK1120: 外部参照 1 が未解決です。 何か初歩的なミスをしている気もしますが、突っ込みなどなど回答の方よろしくお願いします。

  • VS2013のC++のlibの指定

    VS2013のC++のlibの指定に関した質問です。 下記のコードの代わりに、プロジェクトのリンカーオプション(一覧表の中の項目)で 指定できますか? #pragma comment( lib, "Release\\MathFuncsDll.lib" ) 以上、宜しくお願いします。

  • DLLのマルチスレッドの動作について

    今、DLLについて勉強しているのですが動作について、不明点があり質問しています。 単純にDLL内に下記のようにMyFuncという関数があったとします。 (コンパイルは/MTを付けています) MyFunc (){ int i; for(i=0;i<10;i++){ printf("%d\n"); } } これをDLLを呼び出すアプリから複数のスレッドで呼び出したとき、それぞでのスレッド毎に、カウントが増えていきます。 DLLはメモリ共有されると思っているのですが、そうではないのか、いまいちわからない状態でご教授いただければと思っています。 このカウントが別々に増えるのは、コードの領域とデータの領域が別ベルだからと考えればよいのでしょうか? コードは同じ領域を使用して、データは別の領域を使用しているのでしょうか? 次にここで使用しているint iをグローバル変数にすると、カウントはスレッド毎に共有されてしまいます。 グローバル変数にすると、この場合のint iはコードの領域に置かれるということなんでしょうか? ちょっと、的を得ていない質問かもしれませんが、何卒、よろしくお願いいたします。

  • DLLについて

    現在APIの勉強中なのですが不明な部分が出てきました。 今、単純な音を鳴らす関数beepをDLLファイルにExportするプログラムを作っているのですが、DLLファイルのExportをDEFファイルにて行うようプログラムを行いました。 DEFファイルの内容を以下に示します。 ----beepll.def------ LIBRARY beepdll EXPORTS beep @3 このDEFファイルを用いて作成したbeepdll.dllファイルをDUMPBIN.EXEを使用して中身を見たところ次のように表示されました。 File Type: DLL Section contains the following exports for beepdll.dll 00000000 characteristics 45B09596 time date stamp Fri Jan 19 18:55:34 2007 0.00 version 3 ordinal base 1 number of functions 1 number of names ordinal hint RVA name 3 0 00001000 beep = ?beep@@YGXG@Z (void __stdcall beep(unsigned sho rt)) Summary 1000 .data 1000 .rdata 1000 .reloc 1000 .rsrc 1000 .text これを見ると確かに序数は"3"になっているのですがEXPORT名がbeepになっていないように見えるのですが、これで正常なのでしょうか? 環境は Visual C++.NET 2005です。 DEFファイルはビルド前に、[プロジェクト]→[---のプロパティ]→[構成プロパティ]→[リンカ]→[入力]→[モジュール定義ファイル]にて定義しました。

  • Visual C++,OpenCVでのリンクエラー

    こんにちは。 現在、Microsoft Visual C++ 2010 の環境で、OpenCV(ver2.3.1)を用いて、画像認識のアプリケーションを作ろうと考えています。ただ、Visual C++ 、OpenCV共に扱うのが初めてで、openCVのライブラリーをC++に認識させることができていません。 具体的には、下記の様なエラーが出ます。 「 Sample.obj : error LNK2019: 未解決の外部シンボル _cvReleaseImage が関数 _wmain で参照されました。 (同様に、以下の外部シンボルも参照できていません。_cvDestroyAllWindows、_cvWaitKey、_cvShowImage、_cvSmooth、_cvCreateImage、_cvGetSize、_cvNamedWindow、_cvLoadImage) 」 リンクの設定が上手くできていないと考え、 プロジェクト > ○○のプロパティ > 構成プロパティ > リンカー > 全般 > 追加ライブラリディレクトリ に、C:\opencv\build\x64\vc10\lib というように記入し(64bit環境です)、また、 プロジェクト > ○○のプロパティ > 構成プロパティ > リンカー > 入力 > 追加依存ファイル に、opencv_core231d.lib;opencv_imgproc231d.lib;opencv_highgui231d.lib;opencv_objdetect231d.lib;opencv_contrib231d.lib;opencv_features2d231d.lib;opencv_flann231d.lib;opencv_gpu231d.lib;opencv_haartraining_engined.lib;opencv_legacy231d.lib;opencv_ts231d.lib;opencv_video231d.lib を追加しております。 実行しているサンプルファイルは下記になります。 -------------------- // Sample.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 // #include "stdafx.h" //プロジェクトのプロパティ⇒C/C++⇒全般 の追加のインクルードディレクトリに // 『C:\OpenCV2.3\include』を追加のこと #include "opencv2\\opencv.hpp" #ifdef _DEBUG //Debugモードの場合 #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_core231d.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_imgproc231d.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_highgui231d.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_objdetect231d.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_contrib231d.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_features2d231d.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_flann231d.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_gpu231d.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_haartraining_engined.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_legacy231d.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_ts231d.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_video231d.lib") #else //Releaseモードの場合 #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_core231.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_imgproc231.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_highgui231.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_objdetect231.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_contrib231.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_features2d231.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_flann231.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_gpu231.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_haartraining_engined.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_legacy231.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_ts231.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_video231.lib") #endif int _tmain(int argc, _TCHAR* argv[]) { //画像データの読込 IplImage* src_img = cvLoadImage("C:\\opencv\\samples\\c\\lena.jpg", CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR); if (src_img == NULL){ return 0; } //表示ウィンドウの作成 cvNamedWindow("src"); cvNamedWindow("dst"); //処理後画像データの確保 IplImage* dst_img = cvCreateImage(cvGetSize(src_img), src_img->depth, src_img->nChannels); //画像処理例(ガウシアンフィルタ) cvSmooth(src_img, dst_img, CV_GAUSSIAN, 9); //画像の表示 cvShowImage ("src", src_img); cvShowImage ("dst", dst_img); //キー入力待ち cvWaitKey (0); //全てのウィンドウの削除 cvDestroyAllWindows(); //画像データの解放 cvReleaseImage(&src_img); cvReleaseImage(&dst_img); return 0; } --------------- 初心者な質問で大変恐縮ながら、どこを修正すればよいかお分かりでしたら、お教え頂けませんでしょうか?何卒宜しくお願いします。

  • HEW統合開発環境のリンカー設定で”BHEAPMEM”という設定の意味は?

    今、H8S2368用のHEWで動かしていたサンプルプログラムをもらって、動かそうと思っていたときに、このマイコンには、FlashメモリとSRAMメモリが外部についていたので、どのようにアクセスしているのかなと思い調べていたのですが、 リンカーの設定でこの部分をどうやって使用しているのかというのがわかるということを教えてもらいました。 ちなみにFLASHメモリはサイプレス社の”CY62148EV30LL-45ZSX1TSOPII(32P3Y-H)” SRAMはSPANSION社製の”S29GL032N(03,04)”というのがつながっていて、 0x200000~0x40000 これがFLAHSHメモリの領域 0x600000~0x800000 これがSRAMメモリの領域となっています。 このリンカーの設定で0x600000のセクションに”BHEAPMEM”という設定をしているのですが、これはどういう意味の設定になるのでしょうか。 この”BHEAPMEM”という設定をすれば、ローカル変数や、グローバル変数や、バリアブルの変数などはFlashメモリ領域ではなく、0x600000のSRAM領域に自動的にコンパイラはデータを置くようになってくれるのでしょうか?

専門家に質問してみよう