2016年2月13日土曜日

IFileOperationのCopyItemsについて

こんにちは

最近、windows内で、ファイルをコピーするときに、SHFileOperationより、IFileOperationを利用したほうが良いと知りました。windows XP SP3以降はそうらしいです。

しかし、ネット上にIFileOperationの情報が少なくて、実装に大分時間がかかりました。。。それで、ネット上に備忘録も記載します。

参考になったサイトは以下で、そこを見れば、大体のことはわかると思います。

単体ファイルコピーのCopyItem関数についてはmsdnのサイト、そのままでいけました。その後、の複数ファイルをコピーするCopyItems関数の使い方を調べ出して、時間がかかりました。CopyItemをループで回してる人も多そうですね。もしかすると、そっちの方が、内部処理的に早いかもといまさら思いました 笑

CopyItemsを使う場合は以下のようにすれば、可能です。

int CFileManager::CopySelectedFileToSpecifiedFolder(list<CString>* listCopiedFilePath, CString csImportFolder)
{
if (listCopiedFilePath == NULL || listCopiedFilePath->empty() == true) {
return -1;
}

HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE); 
if (!SUCCEEDED(hr))
{
return -1;
}

PIDLIST_ABSOLUTE abSourcePidl = NULL;
SFGAOF attrs;

int srcFileNum = listCopiedFilePath->size();
PIDLIST_ABSOLUTE[] pPidlRawArray = new PIDLIST_ABSOLUTE[srcFileNum]);

int no = 0;
for (list<CString>::iterator it = listCopiedFilePath->begin(); it != listCopiedFilePath->end(); it++)
{
CString strSource = *listCopiedFilePath->begin();
hr = SHParseDisplayName(*it, NULL, &abSourcePidl, 0, &attrs);    
if (FAILED(hr))
{
return -1;
}
pPidlRawArray[no] = abSourcePidl;
no++;
}
    delete[] PIDLIST_ABSOLUTE;

CComPtr<IShellItemArray> pShellItemArr = NULL;
hr = SHCreateShellItemArrayFromIDLists(srcFileNum, (LPCITEMIDLIST*)pPidlRawArray.get(), &pShellItemArr);
if (FAILED(hr))
{
return -1;
}


PIDLIST_ABSOLUTE abDestPidl = NULL;

hr = SHParseDisplayName(csImportFolder, NULL, &abDestPidl, 0, &attrs);
if (FAILED(hr))
{
return -1;
}

CComPtr<IShellItem2> pDestShellItem;

hr = SHCreateItemFromIDList(abDestPidl, IID_IShellItem2, reinterpret_cast<LPVOID*>(&pDestShellItem));
if (FAILED(hr))
{
return -1;
}

CComPtr<IFileOperation> fileOp;
hr = fileOp.CoCreateInstance(CLSID_FileOperation);
if (FAILED(hr))
{
return -1;
}

hr = fileOp->CopyItems(pShellItemArr, pDestShellItem);
if (FAILED(hr))
{
return -1;
}

hr = fileOp->PerformOperations();
if (FAILED(hr))
{
return -1;
}

CoUninitialize();

return 0;
}

std::listを使ってたり、一部コード修正したので、コンパイルは未確認だったりしますが、ほぼ同じコードで動作確認しています。
ご参考までにご利用ください。

ではでは~ 

2015年7月27日月曜日

e2 studioでのテスト駆動開発について

以前より、e2 studio上でテスト駆動開発をしたいと考えていた。visual studioだと、両方の環境を利用する必要があるので、面倒くさい。

以下の方法で、できることを確認したので、備忘録を兼ねて、記載。

動作環境
windows 7 SP1 64bit 
cygwin gcc 4.9.2
e2 studio 4.0.1.007

以下のページをベースにやって、上手く行った。bugdasさんに非常に助けられた。e2 studioだからか、一部、やり方が違うところや、自分がド素人ゆえに詰まった所を追記しておく。
http://qiita.com/bugdasi/items/2e86accdd21e1b60ff6a



1. 初めに、CPPUTESTをwindowsで利用できるようにcygwinでインストールを行う。ここは参考ページのとおりにやれば良いが、最後に、cygwinの環境パスを通す必要がある。わからない方は以下のページを参考にすると良い。
http://rx.tokudenkairo.co.jp/tutorial_cygwin.html#path
後、自分がここでハマったのが、自分のPCにmingwをインストールしてあり、そのパスが優先されてgccを利用したためにコンパイルに失敗した。mingwのパスが通っているのなら、外しておくべき。


2. e2 studioでプロジェクトを新規作成。
 C++プロジェクトで実行可能→Hello World C++ Project を選択
 ツールチェインに cygwin gccを選ぶ。 その後、終了をクリック。

3. デバッグをするために必須とのことで、以下のパスを通す。でも、もしかしたら、いらないかも。。。
ウィンドウ→設定 で 設定ウィンドウを開き、C→デバッグ→ソース検索パス→パス・マッピングに \cygdrive\c\ → C:\を登録
参考ページ https://keitarian.wordpress.com/2013/03/29/cygwin-eclipse-cdt-%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89-windows/


4. その後は、最初に示したページ通りに、設定を行っていく。
一つだけ、注意点としては、C:\を/cygdrive/c/に置き換えると書いてあるが、そうすると、逆にコンパイルエラーが出た。
普通にC*\のままでやれば、コンパイルが通る。
以下に主要な設定ページをさらしておく。




以上で、テストの実行が可能なはず。まあ、基本的には最初の参考ページ通りにやれば、上手くいく。

ちなみに、gccではなく、実行環境と同じルネサスのCC-RXでコンパイルできれば、なお良いが、生成されるmotファイルをPCのみでテスト実行する方法が分からなかった。いずれなんとかしたいなあ。。。

それでは、少しでも快適なテスト生活を送りましょう。

2015年3月19日木曜日

「PRJ0002 : エラーの結果 31 が 'C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\mt.exe' より返されました。」の対策

突然、Visual Studio 2008でコンパイルできなくなった。
今更、Visual Studio 2008を使っている人はほとんど、いないとは思うけど。。。、2日位かかって、ようやく解決したので備忘録でメモ。


現象
以前まで、コンパイルできていたソースがパソコンを再起動後に、以下のエラーを出力して、コンパイルできなくなった
error PRJ0002 : エラーの結果 31 が 'C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\mt.exe' より返されました。

環境
Windows7
Visual Studio 2008 Professional
SP1 Update済み

対策
下記のソフトをアンインストール後、VisualStudioを再インストールでコンパイル可能になった
  • Microsoft Windows SDK for Visual Studio 2008 .NET Framework Tools -jpn
  • Microsoft Windows SDK for Visual Studio 2008 Headers and Libraries
  • Microsoft Windows SDK for Visual Studio 2008 SDK Reference Assemblies and IntelliSense
  • Microsoft Windows SDK for Visual Studio 2008 SP1 Tools
  • Microsoft Windows SDK for Visual Studio 2008 SP1 Win32 Tools
  • Microsoft Visual Studio 2008 Professinal Edition - 日本語
アンインストール後、PC、を一度再起動したほうが良さげ。


Visual Studioの再インストールはそれだけで、2,3時間かかるから、解決策を探るのに時間がかかって大変 (泣)

治って良かった。

2014年12月26日金曜日

MVCのモデルについて備忘録を書いておく。

MVCは何度読んでも、分かりにくいが、ちょっとずつ理解は進んでいる気がするので、現状の理解について、記載しておき、後で、また振り返ろう!

以下考察。

MVCモデルについて
※あくまで、以下の話はC#FormでMVCを実現する時の話。
  • 実装構造を考えた時に、Controller(以下con)の存在価値がわからなくなる。
    • C#ではユーザーの操作を基本的にViewで受けざるをえないため。Controllerでユーザーの処理を受けるという基本的な使い方はMVCの構成は使えない。
  • 他の話で、ViewとModelの両方で使用したい関数があった場合に、共用できる関数群が無いと不便。
    • もし、ViewとModel間にConを挟む場合、この不便さはやばい。
  • Viewは表示機能と、入力データチェック、ControllerはModelにデータを渡す時と、Viewの表示統括(表示更新するウィンドウの指定処理)、
  • Modelは表示と無関係なデータを処理すると考える。
    • 切り分けが難しいが、ViewとModelはモジュールとして利用し、モジュール間を結ぶのがControllerとかんがえると良い気がする。

  • 使いドコロ
    • MVCは表示機能を実装する時の、プログラムの一部だと考える。故に、MVC以外にCommon等のフォルダを用意して、MVC全てから、呼び出せるフォルダを作る。
  • 基本データをModelに必ず置くと考えると上手くいかない。
    • Viewを表示する時に、必要とする流動的なデータをModelに置くと考えれば、うまくいくかも。。。
      • 固定値なら、Common等のどこからでも、アクセス可能なフォルダに置く。



  • MVCは表示を移植する時に便利な機能である前提で考えると、うまくいく気がする。


これで上手く実装できたら、嬉しい(*^^*)

2014年12月2日火曜日

【備忘録】C++,C#の特徴とdllについて

C++の特徴
マルチパラダイム 手続き型、オブジェクト指向、ジェネリック 等が出来る
書き方によっては結構高速に動作する
ポインタが使える
C言語の互換性が多少ある
組み込み開発で使われている

C# の特徴
include文が不要
try-catch-finallyが使える
継承機能が豊富
メモリに対するコーディングを安全に書きやすい ガーベージコレクション


VB、VC、C#等すべてをサポートするのは「stdcall」
CとC++だけをサポートするのは「cdecl」
C++クラスは「thiscall」が自動で利用されるため、Cから呼び出せない
自分の中で閉じる関数は速度を理由に「fastcall」を利用しても良い

linuxとWindowsのdll及びlib*****.so.****の違いについて
http://www.glamenv-septzen.net/nifty/others/computer/linux_ldd01.html

windowsとlinuxでライブラリに関する考え方は異なる
そのため、共有することは難しいと考えたほうが良い。(ソースコードはもちろん共有できるが、ライブラリファイルは共有がむずかしいという意味)

mfc dllを作成すれば、後はリンクを調整すればOK。
dllの登録をする。
外部公開用のヘッダファイルを作成し、class __declspec(dllexport) クラス名で公開用クラスを宣言する。
後は、クラス宣言場所と利用場所で、上記ヘッダファイルをインクルードする。

【備忘録】outlookのマクロについて

Outlookのマクロを作成すると、キーボードの押し方を半自動化することが出来る
マクロはデジタル署名をしないと、次の起動時に、無効化されてしまう。
また、outlook2013ではデジタル署名を作成する時に、ツールが無いので、直接program files以下を叩きに行く必要がある。

Outlookのマクロをデジタル認証する手法
http://www.compnet.jp/index.php/archives/2993
http://outlooklab.wordpress.com/2007/02/18/outlook-vba-%E3%83%9E%E3%82%AF%E3%83%AD%E3%80%81%E3%81%AF%E3%81%98%E3%82%81%E3%81%AE%E4%B8%80%E6%AD%A9/

Outlookの全角、半角を常に半角にする方法
If IMEStatus = vbIMEModeOff Then SendKeys "{kanji}"
http://www.relief.jp/itnote/archives/018017.php


2014年11月12日水曜日

mfcの描画機能について備忘録

mfcの描画機能ついて
  • ドキュメント・ビュー構造化
  • オーナードロー機能
    • 自由度の高い描画が可能。ほぼ、自由に表現できる。ただ、ボタンの影や、クリック時の強調処理等、全てを自分で記載する必要がある。
    • OnPaintを使わずに、OnDrawItemで描画処理を記載する。
      • ※mfcではDrawItemをオーバーロードすると利用可能。
    • 参考ページ http://www.kumei.ne.jp/c_lang/sdk/sdk_41.htm
  • カスタムドロー機能
    • オーナードローよりかは自動描画処理に任せつつ、コントロールをカスタマイズ表示できる。カスタムドローするタイミングを自分で決めることが出来る。ただ、それでも結構めんどくさいみたい。
    • 参考ページ http://www.kumei.ne.jp/c_lang/sdk3/sdk_261.htm