- ベストアンサー
XPでBorandC++5.5でコンパイル
成功したプラグラムをダブルクリックしても うんとも寸とも言わないのですが 何が原因でどうしたらいいでしょうか? Windows95,98se,Meにその.exeファイルを持っていくと 動きます また WindowsMeでコンパイルしたプログラムをXPに持っていっても動きません XPでコンパイル成功したプログラムがXPで動かないでMeで動くのは不思議です
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
>しかしマイクロソフトはこのような理不尽なAPIの仕様変更をするのですね いいえ、仕様変更なんかではありませんよ。 NT3.1のころから\は不可です。 Win2k用の仕様は新たに追加になってますが。 >逆ですね。これでなんでMeはOKなんだろう? これって最初から使い方が間違っているのに何で動いてるんだろう?ということだったんですけど。 MSに文句を言う前に、ヘルプやリファレンスくらいちゃんと見ましょうね。
その他の回答 (5)
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>XPでは常に失敗するのですね? 逆ですね。これでなんでMeはOKなんだろう? >GetModuleFileName(NULL,s,MAX_PATH); でとってきたモジュール名を引数にしてCreateMutexしてますが、CreateMutexの引数で使用する文字列には、特殊な形式でしか\を含むことは出来ません。 ということで、\を含まない文字列を指定してください。 http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpdllpro/html/_win32_createmutex.asp
お礼
ありがとうございます 原因がわかりました Mutexの文字列にパスを入れていますが Mutexは'\'を許容しないようです '\'を'|'に変換したらうまくいきました しかしマイクロソフトはこのような理不尽なAPIの仕様変更をするのですね 殿様商売だから仕方がありませんが 具体的には以下のようにしました GetModuleFileName(NULL,s,MAX_PATH); for(str=s,pos=0;(pos=str.find('\\',pos))!=str.npos;str.at(pos++)='|'); hMutex=CreateMutex(NULL,1,str.c_str()); if(!hMutex)return FALSE; 回答内容を見ずに御礼を書いていたら同じ趣旨のことを回答されていましたね 書いたあと見て気がつきましたがせっかく書いたのでそのまま送ります
補足
ところで'|'も将来的に仕様変更の犠牲になると言う情報があれば教えてください
- taka_tetsu
- ベストアンサー率65% (1020/1553)
XPだとWinMain()も実行されてないんですか? WinMain()の最初の方にMessageBox()追加して確認してみてください。表示されますか? というか、XPで作っているのでしたらTurbo Debuggerでデバッグできますよね? http://www.borland.co.jp/cppbuilder/freecompiler/ ヘッダファイルには、XPでNGでMeならOKってのはないですね。
お礼
ありがとうございます 動くはずのものが動かなかったので狼狽してしまいました 冷静に考えて地道に最初から少しずつトレースするしかなさそうですね
補足
地道にやっていると どこでじっこうをやめたのか分かりました WinMainの最初が次のように始まりますが if((pos=(str=str_HELP).find('\"'))==string::npos) i_FREE=0x7fffffff; else { str.erase(0,pos+1); i_FREE=MyDays(str.substr(0,str.find('\"'))); } GetModuleFileName(NULL,s,MAX_PATH); str_work=str_work.substr(0,(str_work=s).find_last_of('\\')+1); hMutex=CreateMutex(NULL,1,s); if(!hMutex)return FALSE; ・・・・・・・・・ と始まりますが hMutex=CreateMutex(NULL,1,s); がFalseを出していました Meと98seでは問題なかったのですが XPでは常に失敗するのですね?
- katouka09
- ベストアンサー率50% (130/256)
実行するとどういうことをするプログラムでしょうか? ハードウェアに直接アクセスするようなプログラムの場合はXPや2000等の環境では動かない場合があります。
お礼
GetModuleFileName(NULL,s,MAX_PATH); hMutex=CreateMutex(NULL,1,s); if(!hMutex)return FALSE; においてXPでは常にhMutexがFalseになるようです XPではCreateMutexは使えないようです それが原因のようです
補足
ありがとうございます もちろんファイルへの読み書きはしていますが それ以外特にハードウェアに直接アクセスしていることはありません 最初の部分を #include "book.h" #include <windows.h> #include <shlobj.h> #include <shlwapi.h>//shlwapi.libのリンクが必要 #include <string> #include <list> #include <vector> #include <fstream> using namespace std; に訂正しても駄目でした なお調べたところ #include <shlobj.h> はXPでも使えるはずだそうです
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
>.exeファイル いえ、ソースの話ですが… >XPの場合プログラムロードの容量にデフォルトで制限が設定されているのではないでしょうか? それは、ないと思います。 95互換でないと動かないAPIを使っているのではないかとか思いますが、そういうことは、ソースを見ないとわかりません。
お礼
コンパイルは作業ディレクトリc:\boo\で次をコマンドライン実行しました bcc32 +win c:\boo\boo shlwapi.lib brc32 c:\boo\boo c:\boo\boo.exe ソースの最初の部分が #define STRICT #include "boo.h" #include <windows.h> #include <shlobj.h> #include <olectl.h> #include <Dbghelp.h> #include <shlwapi.h> #include <string> #include <list> #include <vector> #include <fstream> using namespace std; です shlwapi.lib <shlwapi.h> <shlobj.h> <olectl.h> <Dbghelp.h> のなかにXPで使えないものがあるのでしょうか?
補足
ありがとうございます 95互換でないと動かないAPIを使うとコンパイルエラーになるのではないでしょうか? ちなみに実行エラーメッセージもでません
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
どんなプログラムなんでしょう? 補足でアップすることはできますか
お礼
#include <olectl.h> #include <Dbghelp.h> は使っていないのではずしても大丈夫でした #include <shlwapi.h>//shlwapi.libのリンク必要 はXPでも使えそうです #include <shlobj.h> が未確認です これをはずすと BROWSEINFO,LPITEMIDLIST が未定義エラーになります
補足
ありがとうございます 非常に大きなプログラムで.exeファイル容量が2MB近くになります XPの場合プログラムロードの容量にデフォルトで制限が設定されているのではないでしょうか?
補足
ありがとうございます 規則違反だけ好意でエラーにならなかったと言うことですね 厳密にアウトにしてくれていたら作成段階で気がついていたので好意も時には危険だと言うことですね \の件をクリアしたとたんまたXPだけのエラーが出てしまいました エラーを探して分かったことは Meまでだと SendMessage(hL,LB_ADDSTRING,0,0); はOKだったのですがXPではOUTで SendMessage(hL,LB_ADDSTRING,0,(LPARAM)""); としなければならないのです マイクロソフトのせいにしてはいけませんね