C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[12]: WinUnitをマルチバイトコードで使うと実


(過去ログ 32 を表示中)

[トピック内 30 記事 (1 - 20 表示)]  << 0 | 1 >>

■15474 / inTopicNo.1)  WinUnitをマルチバイトコードで使うと実行時にエラー
  
□投稿者/ PATIO (25回)-(2008/03/13(Thu) 14:38:23)

分類:[C/C++] 

2008/03/13(Thu) 15:01:58 編集(投稿者)

いつもお世話になってます、PATIOです。

マルチバイトコードのDLLを対象にWinUnitを試してみようとやってるんですが、
コマンドプロンプトで動かすと2バイト文字が文字が化けます。
(debug - no unicodeの実行ファイルを使っています)
2バイト文字でメッセージを入れないで動かせば、とりあえず一応動かせますが、
これだとダブルクリックで飛べないです。(T-T)

次にビルド後のイベントで動かそうとしてますが、
これでやると実行時にLoadLibraryWで読み込めないと出てきます。
今後の調査で何かわかったらここに書き込みますが、
何か情報をお持ちの方がいらっしゃいましたらぜひ情報提供をお願いいたします。

ちなみにビルド後のイベントで動作させると以下のメッセージが出ます。

1>Running WinUnit...
1>Processing [TestTestWUnit.dll]...
1>[WinUnit] WinUnitLib::TestModule::GetModule: LoadLibraryW failed on c:\mypro2005\testwunit\debug\TestTestWUnit.dll. ???????????????????
1>[TestTestWUnit.dll] No tests were run.
1>No tests were found.

基本的にはWinUnitの説明:
http://msdn2.microsoft.com/ja-jp/magazine/cc136757.aspx
の内容に従ってやっているんですが、何か見落としがあるんでしょうか。

ちなみにツールから動かすと大丈夫なんですよねぇ。
謎。

引用返信 編集キー/
■15476 / inTopicNo.2)  Re[1]: WinUnitをマルチバイトコードで使うと実行
□投稿者/ PATIO (26回)-(2008/03/13(Thu) 14:53:41)
2008/03/13(Thu) 15:01:40 編集(投稿者)
2008/03/13(Thu) 15:00:58 編集(投稿者)
2008/03/13(Thu) 14:55:08 編集(投稿者)

> 1>Processing [TestTestWUnit.dll]...
> 1>[WinUnit] WinUnitLib::TestModule::GetModule: LoadLibraryW failed on c:\mypro2005\testwunit\debug\TestTestWUnit.dll. ???????????????????
> 1>[TestTestWUnit.dll] No tests were run.
> 1>No tests were found.

ここで、エラーメッセージの時にファイル名が変になっているのが気になりますね。
「c:\mypro2005\testwunit\debug\TestTestWUnit.dll. ???????????????????」
なんか後ろの方に変な物がくっついているみたいです。その所為だろうか?
Processingではちゃんとファイル名が取れているみたいなのでますます謎。
IDEのバグかなぁ。
デバッグやらツールから動かすとうまく行くので$(TargetPath)の展開はうまく行ってそうなんですけど。

追伸:
IDEと言うよりもWinUnitのバグの方がありえそう。
デバッグしてみるかなぁ。

更に追伸:
デバッガで追おうとしたらこのケースだとうまく行っている事に気がついて
結局、駄目ジャンと言う事に。
WinUnitにデバッグ用のコードでも突っ込んでみるしかなさそう。

引用返信 編集キー/
■15479 / inTopicNo.3)  Re[2]: WinUnitをマルチバイトコードで使うと実行
□投稿者/ とっちゃん (249回)-(2008/03/13(Thu) 15:23:35)
とっちゃん さんの Web サイト
No15476 (PATIO さん) に返信

http://blogs.wankuma.com/episteme/archive/2008/02/02/120615.aspx

かな?

違う場合は、ビルドオプションも確認してみてください。<構成プロパティの全般の文字セットのところ

自分で使ってるのは、UNICODE版なので、未確認ですが
元のプロジェクトが英語版のVS2005(Teamエディションのいずれか)なのでSBCS になってるんじゃないかと。

引用返信 編集キー/
■15483 / inTopicNo.4)  Re[3]: WinUnitをマルチバイトコードで使うと実行
□投稿者/ επιστημη (859回)-(2008/03/13(Thu) 15:52:52)
επιστημη さんの Web サイト
No15479 (とっちゃん さん) に返信
> http://blogs.wankuma.com/episteme/archive/2008/02/02/120615.aspx
> かな?

ぴんぽーん♪
ここらへんも含め、CodeZineで3/18公開予定。

引用返信 編集キー/
■15484 / inTopicNo.5)  Re[4]: WinUnitをマルチバイトコードで使うと実行
□投稿者/ PATIO (27回)-(2008/03/13(Thu) 15:57:52)
2008/03/13(Thu) 16:02:56 編集(投稿者)

No15483 (επιστημη さん) に返信
> ■No15479 (とっちゃん さん) に返信
>>http://blogs.wankuma.com/episteme/archive/2008/02/02/120615.aspx
>>かな?
>
> ぴんぽーん♪
> ここらへんも含め、CodeZineで3/18公開予定。

setlocaleだったんですねぇ。
漢字が化ける件はこれで解決と。
問題は、ビルド後のイベントで動かないと言う件だなぁ。
はっ、もしかして私のところだけの現象だったりして。(--;

もう一つ書き忘れがあったので追記
マルチバイトコードのテスト用DLLではテスト用のcppファイルに
#include <limits.h>を入れないとコンパイルでこけると言う現象が
私のところではあったんですが、他の方のところではいかがですか?
#include "WinUnit.h"の上に入れてやると大丈夫のようです。
マルチバイトコードだとlimits.hがインクルードされていない??

引用返信 編集キー/
■15485 / inTopicNo.6)  Re[5]: WinUnitをマルチバイトコードで使うと実行
□投稿者/ επιστημη (860回)-(2008/03/13(Thu) 16:02:00)
επιστημη さんの Web サイト
> 問題は、ビルド後のイベントで動かないと言う件だなぁ。
> はっ、もしかして私のところだけの現象だったりして。(--;

ありゃりゃーん?
僕とこでは WinUnit $(TargetPath) で一発おkでしたですなり。
# WinUnit.exe のパスが通っていれば

引用返信 編集キー/
■15486 / inTopicNo.7)  Re[6]: WinUnitをマルチバイトコードで使うと実行
□投稿者/ PATIO (28回)-(2008/03/13(Thu) 16:05:10)
No15485 (επιστημη さん) に返信
>>問題は、ビルド後のイベントで動かないと言う件だなぁ。
>>はっ、もしかして私のところだけの現象だったりして。(--;
>
> ありゃりゃーん?
> 僕とこでは WinUnit $(TargetPath) で一発おkでしたですなり。
> # WinUnit.exe のパスが通っていれば

ぐはっ、私のとこだけか。
直接、フルパスで指定しているので起動自体は出来てるんですけどね。
なぜかライブラリファイルのロードでこけるのです。
なぜなんだー。
PC再起動すれば直ったりして。(^^;
してみよっ。

引用返信 編集キー/
■15487 / inTopicNo.8)  Re[7]: WinUnitをマルチバイトコードで使うと実行
□投稿者/ PATIO (29回)-(2008/03/13(Thu) 16:15:25)
日本語が表示できるようになって判明した事があります。

問題のメッセージは、
1>[WinUnit] WinUnitLib::TestModule::GetModule: LoadLibraryW failed on c:\MyPro2005\TestWUnit\debug\TestTestWUnit.dll. 指定されたモジュールが見つかりません。
でした。

って、モジュール見つからないってどういうことだぁー。
ちなみにビルド後のイベントに設定している内容。
"C:\MyPro2005\WinUnit\debug - no unicode\WinUnit.exe" "$(TargetPath)"
間にスペースが入ったフォルダだったのでダブルコーテーションで括ってますが、
フルパス指定です。
ターゲットはマクロを使っているので間違いようがないはず。
単純に書出しが遅いだけなんだろうか?
でもビルド終了後にワンテンポ置いて起動なんで真似できたっけ?

引用返信 編集キー/
■15488 / inTopicNo.9)  Re[8]: WinUnitをマルチバイトコードで使うと実行
□投稿者/ επιστημη (861回)-(2008/03/13(Thu) 16:25:55)
επιστημη さんの Web サイト
> 1>[WinUnit] WinUnitLib::TestModule::GetModule: LoadLibraryW failed on c:\MyPro2005\TestWUnit\debug\TestTestWUnit.dll. 指定されたモジュールが見つかりません。
> でした。

command-promptからだと恙無く実行してくれるんよねぇ...
WinUnitのMain.cppアタマでSleepしてみゆ? (半ば冗談/半ば大真面目)

引用返信 編集キー/
■15489 / inTopicNo.10)  Re[9]: WinUnitをマルチバイトコードで使うと実行
□投稿者/ PATIO (30回)-(2008/03/13(Thu) 16:36:34)
No15488 (επιστημη さん) に返信
>>1>[WinUnit] WinUnitLib::TestModule::GetModule: LoadLibraryW failed on c:\MyPro2005\TestWUnit\debug\TestTestWUnit.dll. 指定されたモジュールが見つかりません。
>>でした。
>
> command-promptからだと恙無く実行してくれるんよねぇ...
> WinUnitのMain.cppアタマでSleepしてみゆ? (半ば冗談/半ば大真面目)

やってみました。
駄目でした。(T-T)
思い切って20秒くらい待たせてみましたが、結果は同じでした。
うーむ、わからん。
まあ、ツールから起動すればいいんだし、ビルド後のイベントは外すかなぁ。(T-T)

引用返信 編集キー/
■15490 / inTopicNo.11)  Re[10]: WinUnitをマルチバイトコードで使うと実行
□投稿者/ επιστημη (862回)-(2008/03/13(Thu) 16:42:26)
επιστημη さんの Web サイト
>>command-promptからだと恙無く実行してくれるんよねぇ...
>>WinUnitのMain.cppアタマでSleepしてみゆ? (半ば冗談/半ば大真面目)
>
> やってみました。
> 駄目でした。(T-T)
> 思い切って20秒くらい待たせてみましたが、結果は同じでした。
> うーむ、わからん。

ダメ元でshellを経由してみゆ。
cmd /c WinUnit $(TargetPath)
とか。

> まあ、ツールから起動すればいいんだし、ビルド後のイベントは外すかなぁ。(T-T)

それだとdouble-clickで飛んでけないよねー

引用返信 編集キー/
■15491 / inTopicNo.12)  Re[11]: WinUnitをマルチバイトコードで使うと実行
□投稿者/ επιστημη (863回)-(2008/03/13(Thu) 16:44:37)
επιστημη さんの Web サイト
あ、「外部ツール」に登録したばやいはいかがでしょうか。

引用返信 編集キー/
■15492 / inTopicNo.13)  Re[11]: WinUnitをマルチバイトコードで使うと実行
□投稿者/ PATIO (31回)-(2008/03/13(Thu) 17:07:42)
No15490 (επιστημη さん) に返信
> ダメ元でshellを経由してみゆ。
> cmd /c WinUnit $(TargetPath)
> とか。

これは試した結果駄目でした。
何が悪いのかさっぱりです。

>>まあ、ツールから起動すればいいんだし、ビルド後のイベントは外すかなぁ。(T-T)
>
> それだとdouble-clickで飛んでけないよねー

> あ、「外部ツール」に登録したばやいはいかがでしょうか。

いえ、外部ツールに登録しておいてそれからの起動のことです。
こっちならうまく行くんですよー。(T-T)
この場合は、ダブルクリックもOKです。


引用返信 編集キー/
■15493 / inTopicNo.14)  Re[12]: WinUnitをマルチバイトコードで使うと実行
□投稿者/ PATIO (32回)-(2008/03/13(Thu) 17:36:53)
ちなみにですが、

> マルチバイトコードのテスト用DLLではテスト用のcppファイルに
> #include <limits.h>を入れないとコンパイルでこけると言う現象が
> 私のところではあったんですが、他の方のところではいかがですか?
> #include "WinUnit.h"の上に入れてやると大丈夫のようです。
> マルチバイトコードだとlimits.hがインクルードされていない??

こういう現象が起きている人いますか?
テストDLLがUNICODE使用だと大丈夫なのにマルチバイトコードにすると
出るみたいです。

引用返信 編集キー/
■15495 / inTopicNo.15)  Re[13]: WinUnitをマルチバイトコードで使うと実行
□投稿者/ とっちゃん (250回)-(2008/03/13(Thu) 19:55:43)
とっちゃん さんの Web サイト
No15493 (PATIO さん) に返信

・limits.h の件

昔から、こいつは別途インクルードが基本です。
ちょっと気になったのでVC9(2008)で検索してみたところ、stdlib.h が include してますね。

もしかしたら、windows.h の include でいろいろ取り込んでる中に
条件で入ってくるとかがあるのかもしれません。

どっちにしても、include されてることを期待していいヘッダーじゃないので
自分でインクルードするのがベストの対策と思います。


・ロードできない件

DLLがほかのDLLをロードしていませんか?

c:\MyPro2005\TestWUnit\debug\TestTestWUnit.dll
のフォルダに、TestTestWUnit.dll がロードするDLLがあって
このフォルダにPATHが通っていない場合は、ロードできなくてエラーになります。

なんせ、おいらも同じ原因で、ロードできずに悩んだのでwww

対策としては
1.起動フォルダが該当フォルダになるように設定しておく
2.依存するDLLをパスの通った場所に置く(パスを通すでもよい)
3.WinUnitLib の TestModule.cpp の LoadLibraryW(_fileName); を LoadLibraryExW(_fileName, NULL, LOAD_WITH_ALTERED_SEARCH_PATH ); に変更する。

のいずれかとなります。

えー、なんというか、DLLのロードはいろいろとあるので、WinUnitLibを修正が一番よい対策方法です。

引用返信 編集キー/
■15496 / inTopicNo.16)  Re[4]: WinUnitをマルチバイトコードで使うと実行
□投稿者/ とっちゃん (251回)-(2008/03/13(Thu) 20:43:45)
とっちゃん さんの Web サイト
No15483 (επιστημη さん) に返信

> ここらへんも含め、CodeZineで3/18公開予定。
>
気がついたらスレ延びてて、コメントし損ねた...orz
楽しみにしてますw

って、本題はそっちじゃなくてw

DLLのロードエラー(その対処方法)もまだ間に合うようならちょこっと乗せてもらえるとありがたいかとw

あ、MFC拡張DLLのデバッグと合わせててめーのブログのネタにするかなぁw<記事見てからw

引用返信 編集キー/
■15497 / inTopicNo.17)  Re[5]: WinUnitをマルチバイトコードで使うと実行
□投稿者/ επιστημη (864回)-(2008/03/13(Thu) 21:24:45)
επιστημη さんの Web サイト
2008/03/13(Thu) 21:39:15 編集(投稿者)

> DLLのロードエラー(その対処方法)もまだ間に合うようならちょこっと乗せてもらえるとありがたいかとw

# ごめーん、とっくに校了してますのん。
...てことはそれが原因だとすると
「外部ツール」からの起動と「ビルド後イベント」での起動では
通ってるパスが違うゆーことになりますな。

http://cid-07c558f8e11e708f.skydrive.live.com/self.aspx/%e5%85%ac%e9%96%8b/WinUnit_for_PATIO.zip
↑CodeZineで使ったサンプルのsubsetです。
「ビルド後イベント」で動いたし、MBCSでも#include不要。ためしてみてみてみて。

引用返信 編集キー/
■15499 / inTopicNo.18)  Re[6]: WinUnitをマルチバイトコードで使うと実行
□投稿者/ とっちゃん (252回)-(2008/03/13(Thu) 23:06:02)
とっちゃん さんの Web サイト
No15497 (επιστημη さん) に返信
> 2008/03/13(Thu) 21:39:15 編集(投稿者)
>
>>DLLのロードエラー(その対処方法)もまだ間に合うようならちょこっと乗せてもらえるとありがたいかとw
>
> # ごめーん、とっくに校了してますのん。
やっぱりw
#おいらだって公開前週には校了してたもんなぁw


> ...てことはそれが原因だとすると
> 「外部ツール」からの起動と「ビルド後イベント」での起動では
> 通ってるパスが違うゆーことになりますな。
>
外部ツールの場合は、起動フォルダを$(TargetDir)にしておけば、この問題は回避できます。
#たぶんそうなってるんじゃないかな?

ですが、ビルド後イベントだと、それができないので(設定項目がない)複数行のコマンドにしておかないとダメっす。
pushd $(TargetDir)
winunit $(TargetPath)
popd
という感じですね(って、cmd.exe なしで行けるんだっけ?<わかってねー人w)

> http://cid-07c558f8e11e708f.skydrive.live.com/self.aspx/%e5%85%ac%e9%96%8b/WinUnit_for_PATIO.zip
> ↑CodeZineで使ったサンプルのsubsetです。
> 「ビルド後イベント」で動いたし、MBCSでも#include不要。ためしてみてみてみて。
>
出来上がりがあったんで、見てみましたが、これなら問題ないです。
#.NET Framework とはロードパターンが違うのでw

Native の LoadLibrary のサーチ場所は
カレントディレクトリ
EXEのディレクトリ(ここが重要)
%PATH%
App Path(レジストリ)のパス
Windows ディレクトリ
System32 ディレクトリ(x86の場合)
になります。

DLLは、どこまで行っても従属なので、自身のフォルダは検索対象にはならんのですよ。
なので、ちょっとしたテストの場合は、カレントをDLLの場所にするか
WinUnit などのローダーを、DLLのフォルダに持ってくるかの2択になるんですよ。

まぁ、この手のネタではまった経験のある人ってのはMFC拡張DLL使ってる人くらいな気はするんで
絶対数的には多くはないと思うんですがねw

COMは、ローダーが LoadLibraryEx を使ってるので、この問題は出ないです。
#もちろん、COM.DLL のある場所の場合のみ

ま、最近は、上記のフォルダ+PrivateSxSやMUIがあるんで、ちょっとややこしいですがw
#GlobalSxS は、上記パスとは別のサーチが入ります

limits.h の件の続き...
WinUnit.h で、INT_MAX 使ってますが、επιστημηさんのサンプルだと
出ないっすね。

ものの見事に単純なやつなので、なんか別の理由でNGになってるみたいですよ>PATIOさん

こっちは何でだかわかんねーや...w

引用返信 編集キー/
■15501 / inTopicNo.19)  Re[7]: WinUnitをマルチバイトコードで使うと実行
□投稿者/ PATIO (33回)-(2008/03/14(Fri) 09:08:29)
とっちゃん さん、επιστημη さん、返信ありがとうございます。

ロードエラーの件、確かにテスト対象のクラスがDLLなのでカレントディレクトリの
問題みたいです。しかし、あれってカレントディレクトリは$(TargetDir)じゃないんですねぇ。
私はてっきり$(TargetDir)だと思い込んでました。
バッチファイルか、WSHでこさえてそれを使って試してみます。
それなら多分大丈夫ではないかと思うので。

CodeZine記事は楽しみにしています。
どんな内容になっているかわくわくです。

>>http://cid-07c558f8e11e708f.skydrive.live.com/self.aspx/%e5%85%ac%e9%96%8b/WinUnit_for_PATIO.zip
>>↑CodeZineで使ったサンプルのsubsetです。
>>「ビルド後イベント」で動いたし、MBCSでも#include不要。ためしてみてみてみて。

どんな風に手当てがしてあるのか確認してみます。


> DLLは、どこまで行っても従属なので、自身のフォルダは検索対象にはならんのですよ。
> なので、ちょっとしたテストの場合は、カレントをDLLの場所にするか
> WinUnit などのローダーを、DLLのフォルダに持ってくるかの2択になるんですよ。
>
> まぁ、この手のネタではまった経験のある人ってのはMFC拡張DLL使ってる人くらいな気はするんで
> 絶対数的には多くはないと思うんですがねw

私の場合、VisualStudioを起動するバッチでライブラリにパスを通しておいて起動、
終了後に元に戻すと言うのをしています。
色々なアプリやらライブラリを扱うので必要なディレクトリだけパスを通すようにしておかないと
うまく行かないケースがあるので。
一つのシステムを組むのに内製のDLLを5、6本は使うのでパス問題は良く引っかかるんですけどね。
(^^;


> limits.h の件の続き...
> WinUnit.h で、INT_MAX 使ってますが、επιστημηさんのサンプルだと
> 出ないっすね。
>
> ものの見事に単純なやつなので、なんか別の理由でNGになってるみたいですよ>PATIOさん
>
> こっちは何でだかわかんねーや...w

私はとりあえず、自分のテスト用CPPファイルでlimits.hをインクルードしました。
恐らく、プリプロセッサの関係でインクルードが外れたんだろうくらいにしか思わなかったので
そこから先は深く考えないでさくっとインクルード。(^^;
とにかく、επιστημηさんのサンプルを見てみます。

引用返信 編集キー/
■15502 / inTopicNo.20)  Re[8]: WinUnitをマルチバイトコードで使うと実行
 
□投稿者/ επιστημη (865回)-(2008/03/14(Fri) 09:36:31)
επιστημη さんの Web サイト
> CodeZine記事は楽しみにしています。
> どんな内容になっているかわくわくです。

ぃゃー、ビギナ向けに使い方だけを詳説してるだけっす。

> どんな風に手当てがしてあるのか確認してみます。

...テスト対象がDLLじゃなく、フツーのstatic-lib
なので手当てもヘッタクレもないですぅ

DLLがDLL呼ぶのがトラブルの元なら
テスト対象のプロジェクト内に#include <WinUnit.h>した
テストケースもぶっこんでひとつのDLLにしちまえば問題なさげかな。

WinUnitはDLLがexportした関数のうち、TEST_ で始まるやつを
選択して呼び出します。BEGIN_TESTマクロでアタマにTEST_ を
くっつけてます。
"チョー簡単なんちゃってリフレクション"をやってるですね。

引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -