おとついの晩ご飯

忘れやすいので忘れたくないことを書いています。

【VisualStudio】C++プロジェクトのリモートデバッグ方法

問題

リモートデバッグの方法をわすれてしまいそうなのでメモ


解決

  1. リモートPC(アプリを動かすPC)にリモートデバッグツールをインストールする。 https://visualstudio.microsoft.com/ja/downloads/ f:id:meme1111aMOMO:20210625174949p:plain

  2. 動作確認をしたいアプリケーションをリモートPCに配置する。

  3. リモートデバッグツールのツール > オプションで、認証モード:認証なし を選択し、[すべてのユーザーにデバッグを許可する]の部分にもチェックを入れる。
    [アイドルタイムの最大値]は0に設定。
    ※セキュリティー上問題ない場合

  4. ローカルPC(VisualStudioがインストールされているPC)でプロジェクトのプロパティより以下の設定を行う。

    • 構成プロパティ > デバッグを選択し、起動するデバッガーを[リモート Windows デバッガー]にする。  f:id:meme1111aMOMO:20210625180820p:plain
  5. その他の項目は以下の通り設定する。

    • リモートコマンド:リモートPCのEXEのパス。([例]C:\remote\Test.exe)
    • リモートコマンド引数:必要であれば設定する。
    • 作業ディレクトリ:よくわからない(とりあえずc:\remote)
    • リモートサーバー名:リモートPCのIPアドレスまたは、リモートPC名を設定。
    • 接続:認証なしでリモート接続する(※安全性が確保できる場合)
    • 配置ディレクトリ:よくわからない(とりあえずc:\remote)
  6. ローカルPCよりVisualStudionのデバッガーを[リモート Windows デバッガー]にして実行する。
     f:id:meme1111aMOMO:20210625182040p:plain


うまくいかない時

  • ローカル環境でのリモートデバッグの場合、IPアドレスサブネットマスクがローカルPCとリモートPCで一致しているかを確認する。
    IPアドレスはローカル:192.168.0.2、リモートPC:192.168.0.3といった風に設定。

  • VisualStudio上にリモートPCが表示されない場合(Windows10 Pro)
    Local Security Policy ⇒ Network ListManager Policies ⇒ Unidentified Networksの  Location:private
     User Permissions:User can change location
    に設定する。

【Windows】ストアプリの削除方法

問題

Windowsのストアアプリを削除する方法を忘れるので書いておく


解決

ログオンしているユーザー環境でストアアプリを削除するには、以下のようにWindowアイコンから削除したアプリで右クリックすることで可能。
f:id:meme1111aMOMO:20210625065840p:plain

ただし、PCに複数のユーザーアカウントがありその全てのアカウントから削除することはできていない。


全てのアカウントからアプリを削除するには「PowerShell」から行う。
PowerShellを管理者権限で実行し、以下コマンドを実行する。

// まず削除したパッケージのフルネームを取得するため以下を実施する
// "|"以降は表示する内容を絞るためのコマンドなのでなくてもOK
$ Get-AppxPackage | Format-List -Property PackageFullName

// パッケージ名の一部がわかっていれば、パッケージ名の前後に*をつけてワイルドカード検索でもOK
$ Get-AppxPackage *<パッケージ名の一部>*

▽こんな感じで表示される f:id:meme1111aMOMO:20210625173324p:plain


表示された一覧より、削除したいアプリのパッケージフルネームを取得し、以下のコマンドで削除を行う。

$ Remove-AppxPackage -AllUsers <削除したいアプリのフルパッケージネーム>


ただし、この方法でも削除できないアプリがある。
おそらくOSインストール時からのプリインアプリ。 この場合は、

Get-AppxProvisionedPackage -Online | Format-List -Property PackageName

このコマンドでパッケージ名を取得して、先ほどと同じ削除コマンドで削除する。

【Git】.gitignoreファイルを変更ファイル一覧に表示しない

問題

Gitの変更ファイル一覧に.gitignoreが表示されてとても邪魔なので.gitignoreを無視して、管理ファイルから外す方法を知りたい。


解決

以下コマンドを実行することで.gitignoreが変更ファイル一覧に表示されなくなる。

git update-index --assume-unchanged .gitignore

いつもやり方忘れて参考サイトを探すけど、そのサイトが見れないことがたまにあるので書いておく。

【C++】DLLの使用・作成方法

DLL(lib)の作成方法

汎用的な関数などをDLLとして外出しすることで、様々なアプリから呼び出すことが可能になる。

基本的にVisualStudioでDLLのテンプレートを使って作成。
追加で以下を対応する。

▼DllFunc.h

// 関数をDLLとして出力するためのマクロ
#define DLL_FUNC_EXPORT extern "C" __declspec(dllexport)

// 関数の頭にマクロをつけて宣言(上記の内容が展開される)
DLL_FUNC_EXPORT void DllFunction();


▼DllFunc.cpp

// 関数の中身を書く
DLL_FUNC_EXPORT void DllFunction()
{
    // 汎用的な処理など
};

マクロを関数に付与することで、Libが自動的に出力される。
(プロジェクトのプロパティ > 構成の種類がEXEの場合のみ?)


DLLの使用方法

動的リンクまたは、静的リンクのいずれかを行い、DLL内の関数を使用する。

リンク方法 内容 必要な物
動的リンク LoadLibraryを使用する DLL
静的リンク EXEにDLLのLibを組み込む Lib

動的リンク

// 関数ポインタを定義(DLLの関数の型に合わせる)
typedef void (__stdcall* DLL_FUNC)();  

// 以下でもOK? typedefは古いとか
// using DLL_FUNC = void (*)(); 

// LoadLibraryを使ってDLLを読み込む
HMODULE dll = LoadLibrary("DLLのパス");
if(dll == nullptr)
{
    //終了
    return;
}

// GetProcAddressを使って関数を取得する
// ※キャストの仕方がCのやり方で古いから変えたほうが良いかも?
auto func = (DLL_FUNC)GetProcAddress(dll, "DllFunction");
if(func == nullptr)
{
    // 終了
    return;
}

// 実行
func();

// DLLの破棄
if(dll)
{
    FreeLibrary(dll);
    dll = nullptr;
}

注意点としては、動的リンクではDLLが指定されたパスにないと失敗する。また、関数名も文字列で指定する必要があるので、間違いやすい部分もある。


静的リンク

まずプロジェクトにDLLのLibファイルを追加する。 f:id:meme1111aMOMO:20210618065147p:plain

または、"pragma comment"を使う方法でも可能

#pragma comment(lib,"Libへのパス")


▼ImportDll.h

// DLLの関数を呼び出すためのマクロ
#define DLL_FUNC_IMPORT extern "C" __declspec(dllimport)

// プロトタイプ宣言(Dllと関数名を合わせる)
DLL_FUNC_IMPORT void __stdcall DllFunction();


▼ImportDll.cpp

// 関数を呼び出す
DllFunction();


【C++】排他制御について

C++排他制御についてメモ

マルチスレッドで処理を行うアプリケーションで、同一のグローバル変数へアクセスし値を更新するような場合は、排他制御を行う必要がある。

// クリティカルセクションオブジェクトへのポインタ
// グローバル変数として定義する
CRITICAL_SECTION obj;

private void HaitaThread()
{
    // 初期化
    InitializeCriticalSection(&obj);

    // 排他処理を開始
    EnterCriticalSection(&obj);

    // ※※※ここに処理を入れる※※※

    // 排他処理を終了
    LeaveCriticalSection(&obj);
}


【C++】MSVCP140d.dllなどが見つからないエラーが表示される場合

問題

C++で作成したアプリケーションを動作確認のため他のPCにもっていくと、「MSVCP140d.dllが見つからない」というようなエラーメッセージが表示され、アプリケーションが動かない。


解決

ランタイムライブラリーが実行環境に存在しないので、このようなエラーが発生する。
VisualStudio > プロジェクトのプロパティ > 構成プロパティ > C/C++ > コード生成 > ランタイム ライブラリ の値を「/MT」か「/MTd」に変更する。
f:id:meme1111aMOMO:20210618064536p:plain

これはプロジェクト内にランタイムライブラリを含めるかの設定で、実行環境にランタイムライブラリが存在するのであれば、「/MD」で問題ないが、存在しない可能性があるのであれば変更しておく。

かなり大事な設定だと思うけど、設定場所が奥深くにあるので、初心者は絶対気づけないと思う。。。

設定値 内容
/MT ランタイムライブラリを含める
/MTd ランタイムライブラリを含める(デバッグ用)
/MD ランタイムライブラリを含めない
/MDd ランタイムライブラリを含めない(デバッグ用)


ちなみに

ランタイムライブラリをダウンロードして指定のフォルダ入れてあげることで、動かすこともできます。
▼下記サイトを参考に

qiita.com


【プログラミング】DLLについて

問題

DLLってどういう立ち位置のものかがいまいちわかっていない。


解決

考え方としてはこう。
DLLはEXEに入れるべき汎用的な処理などをEXEとは分けたもの。
分けたことで1つのEXEだけでなく他のEXEからも呼ぶことができ、それ以降の製造コストが削減できる。
上記のEXEから分けたものということより、DLLはEXEの一部という認識で良い。
EXEを起動したことでプロセスが生成され、同一プロセス内でDLLの機能も使える。
EXE⇔DLL間でポインタを使って変数や関数を共有できるのはそういうこと。