「VC PlusPlus:DLLのデバッグRegsvr32登録して使うタイプの場合Windows10 64bit」の版間の差分
(ページの作成:「VC PlusPlusに戻る == '''概要''' == Deskbandのdllのサンプル([https://docs.microsoft.com/en-us/samples/microsoft/windows-classic-samples/deskbands/ https://docs.microsoft.com/en-us/samples/microsoft/windows-classic-samples/deskbands/])を入手したのですが、どうやってデバッグするかわかりませんでした。今回の場合はregsvr32から呼び出されるタイプだったのですが、その他のdll呼び出しメカニズ…」) |
編集の要約なし |
||
9行目: | 9行目: | ||
ヘッダ追加と名前空間の設定 | ヘッダ追加と名前空間の設定 | ||
< | <syntaxhighlight lang="cpp"> | ||
#include <tlhelp32.h> | #include <tlhelp32.h> | ||
#include<iostream> | #include<iostream> | ||
#include<fstream> | #include<fstream> | ||
using namespace std; | using namespace std; | ||
</ | </syntaxhighlight> | ||
プログラム部 | プログラム部 | ||
< | <syntaxhighlight lang="cpp"> | ||
WCHAR wcpBuff[256]; | WCHAR wcpBuff[256]; | ||
WCHAR wcpGetModuleFileNameBuff[256]; | WCHAR wcpGetModuleFileNameBuff[256]; | ||
33行目: | 33行目: | ||
outputfile << wcpBuff; | outputfile << wcpBuff; | ||
</ | </syntaxhighlight> | ||
2022年9月26日 (月) 10:04時点における最新版
VC PlusPlusに戻る
概要
Deskbandのdllのサンプル(https://docs.microsoft.com/en-us/samples/microsoft/windows-classic-samples/deskbands/)を入手したのですが、どうやってデバッグするかわかりませんでした。今回の場合はregsvr32から呼び出されるタイプだったのですが、その他のdll呼び出しメカニズムを使っている場合は、ここで紹介する例だけでは、対応できないです。アタッチがキーワードになると思います。
まずは、dllを動作させる方法を知っているとして、呼び出し元がよくわからない場合はdllのプロジェクトのDllMain関数に以下のプログラムを追加すると良いでしょう。
ヘッダ追加と名前空間の設定
#include <tlhelp32.h>
#include<iostream>
#include<fstream>
using namespace std;
プログラム部
WCHAR wcpBuff[256];
WCHAR wcpGetModuleFileNameBuff[256];
HMODULE hModule = NULL;
std::wofstream outputfile2("test.txt", ios::trunc);
outputfile2.close();
std::wofstream outputfile("test.txt", ios::app);
outputfile.imbue(std::locale("", LC_CTYPE));
GetModuleFileName((HMODULE)hModule, wcpGetModuleFileNameBuff, 256);
wsprintf(wcpBuff, L"");
wsprintf(wcpBuff, L"■GetModuleFileName = %ls\n", wcpGetModuleFileNameBuff);
outputfile << wcpBuff;
上記のプログラムを追加すると、test.txtファイルにプログラムファイル名が記述されます。アタッチするとよいでしょう。自分はDLLのプログラムを作ったことないし、サンプルもまだ入手したことないです、アタッチのやり方は知らないので、よくわからないですけど、ここまで分かってたら、きっとうまく行きます。
今回のサンプルだとregsvr32に登録して使うタイプだとなっているので、コマンドプロンプトで「regsvr32 DeskbandSDKSample.dll」で登録すると以下のようなメッセージが受け取れます。管理者権限のコマンドプロンプトである必要があります。dllのあるディレクトリパスもちゃんと合わせないと駄目ですよ。カレントディレクトリを移動するか、パス付きでdll名を指定するかですね。
■GetModuleFileName = C:\WINDOWS\SysWOW64\regsvr32.exe
そうすると、これは間違いなくregsvr32から呼び出されてますね。
この場合、以下のような手順で、デバッグ作業が始められます。
1.Visual Studio 起動アイコンを右クリックして管理者として実行。プロジェクトを開く
2.プロジェクトのプロパティダイアログを開く
- 左の領域のTreeでDebugを選択する。
- コマンド = C:\WINDOWS\SysWOW64\regsvr32.exe
- コマンド引数 = $(OutDir)$(TargetName)$(TargetExt)
- 作業ディレクトリ = $(OutDir)
- その他の設定は規定値でいいよ。
3.デバッグ実行
VC PlusPlusに戻る