- ベストアンサー
拾ってきたソースをうまくビルド出来ない
正確に言うと、ソースの言語がC++なのかC#なのかわかりません。 おそらくC++だろうと思ってるのですが・・・。 #include <stdio.h> #include <string.h> #include <windows.h> int Time[5]={0}; DWORD GetRegInt(LPCTSTR lpszSection, LPCTSTR lpszEntry, DWORD dwDefault) { BOOL bResult = FALSE; DWORD dwBuffer = 0; HKEY hOpenKey; if(RegOpenKeyEx(HKEY_CURRENT_USER, lpszSection, 0, KEY_EXECUTE, &hOpenKey) == ERROR_SUCCESS) { DWORD dwType; DWORD dwBufferSize = sizeof(DWORD); if(RegQueryValueEx(hOpenKey, lpszEntry, 0, &dwType, reinterpret_cast<LPBYTE>(&dwBuffer), &dwBufferSize) == ERROR_SUCCESS) { bResult = TRUE; } RegCloseKey(hOpenKey); } if(!bResult) { dwBuffer = dwDefault; } return dwBuffer; } void GetRegString(LPCTSTR lpszSection, LPCTSTR lpszEntry, LPCTSTR lpszDefault, LPTSTR lpBuffer, DWORD nSize) { BOOL bResult = FALSE; HKEY hOpenKey; if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpszSection, 0, KEY_EXECUTE, &hOpenKey) == ERROR_SUCCESS) { DWORD dwType; DWORD dwBufferSize = nSize; if(RegQueryValueEx(hOpenKey, lpszEntry, 0, &dwType, reinterpret_cast<LPBYTE>(lpBuffer), &dwBufferSize) == ERROR_SUCCESS) { bResult = TRUE; } RegCloseKey(hOpenKey); } if(!bResult) { lstrcpyn(lpBuffer, lpszDefault, nSize); } } (文字制限を越えてしまったので、下半分を消しました) とりあえず、なにはともあれ試しにビルドしてみようと思い、bcc55でやってみました。 結果、.exeファイルと、.objともう一つ(名前忘れた)ができて、うまくできたかと思い、起動してみたのですが、DOSが開いてすぐ閉じてしまいます。 元々、このソースは既にビルドされた.exeファイルと一緒にアップロードされてたので、うまくいったらこういう動作をするっていうのは分かってたので、うまくビルドできてないのでしょう・・・。 そこで考えられる原因を考えたら、「言語が違う」これしか思いつきませんでした。 C#なのかもしれないと思い、Microsoft Visual C# Express Editionでも試してみましたが、これもうまくいかず、google先生に頼ってみましたが行き詰ってしまいました。 質問したい点を挙げます。 ・この言語はC++でしょうか?もしくはbcc32でコンパイル可能でしょうか? ・もし不可能な場合、どのコンパイラを使用すればうまくいくでしょうか?(できればフリーソフトでやりたいです)
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
#1です せっかく最初からコンパイル(リンク)できて実行モジュールできていた環境なのに なんか悪化させてるようですね 途中段階を一切見てませんが >プロジェクトをビルドした際のエラー7個のうち、1個がこんな感じです。 私が書いているところのリンクエラーを起こしています 大雑把な意味と(用語使い方)して コンパイルーーーー Cで作成されたソースをコンパイルして中間ファイルを作成 リンク ----- 複数の中間ファイルをリンクして実行モジュールを作成 という形になります(両方の動作を行って実行モモジュール作成することをビルドといいます) ソースファイルのどこかで RegCloseKey とか言う関数をコール(使用) しているにもかかわらずリンクしているファイルの中に その関数が存在していない という意味です ですので実行モジュールができません 普通コンパイル・リンク両方が限り実行モジュールは作成されません だからこそ #1で bccでできてるんでしょ と書いたわけです そのコードが何をやっているかはわからないので 動作確認するためにはソース見たりデバック作業が必要になります
その他の回答 (7)
- koi1234
- ベストアンサー率53% (1866/3459)
#7補足 ついでに書いておきますと RegCloseKey というのは WindowsAPIの関数でレジストリ操作をする関数です 仮にコンソールアプリなどで作成しているのであれば リンク時に advapi32.lib を一緒に リンク指定してやる必要があります(VC6++のヘルブでの話) ----以下RegCloseKey関数Helpからの抜粋-------- Windows NT: Requires version 3.1 or later. Windows: Requires Windows 95 or later. Windows CE: Requires version 1.0 or later. Header: Declared in winreg.h. Import Library: Use advapi32.lib.
- mtaka2
- ベストアンサー率73% (867/1179)
> 結果なんですが、ビルド:1正常終了、0失敗で、できたかなと思ったら、エラー0、警告7となっていて、exeファイルは生成されませんでした。 そのメッセージからすると、コンパイルは成功しています。 「Debug」もしくは「Release」というフォルダの下を見てください。 おそらくその中にexeが出来てると思います。
補足
昨日調べて、警告も0にできましたが、exeファイルは生成されませんでした。 #pragma warning(disable : 4996 )←これで、危険じゃないよって事らしいです。 void Setting(void)←これは元のソースです。 プロジェクトをビルドすると、エラーいっぱい出ますね・・・。 ソースだけならエラー0警告0にできたんですが。 プロジェクトをビルドした際のエラー7個のうち、1個がこんな感じです。 truct HKEY__ *)" (?RegCloseKey@@$$J14YGJPAUHKEY__@@@Z) が関数 "unsigned long __cdecl GetRegInt(char const *,char const *,unsigned long)" (?GetRegInt@@$$FYAKPBD0K@Z) で参照されました。 このエラー文をそのままぐぐったりしたんですが、いまだに意味不明です。 それから設定をちょこちょこ変えながらやってみてるんですが、できませんね。 おそらく、プロジェクトをビルドできないとだめなんでしょうけど・・・。
- buriburi3
- ベストアンサー率44% (353/792)
C++でWin32Apiを使ってレジストリをゴニョゴニョするツールの一部に見えます。 エクスプローラからダブルクリックではなくコンソールから実行ファイル名をタイプして実行すると何かメッセージが出力されているかもしれません。 ※コンソールアプリをエクスプローラから実行するとプログラム終了と同時にコンソールが閉じてしまいます。 このソースをbccではなくVCかgccでビルドしてみては? bcc55ってテンプレートかSTLの実装に不具合があったように思います。
お礼
お待たせしました。 結果なんですが、ビルド:1正常終了、0失敗で、できたかなと思ったら、エラー0、警告7となっていて、exeファイルは生成されませんでした。 その理由についても調べてみようと思ったのですが、自分の知識では明確な答えは得られませんでした。 ぼんやりわかったことしか言えませんが、このソースで記述できなかった部分で、HuckShieldのバージョンチェックが入る際に、チェック終了と同時に、旧バージョンを置き換えてHuckShieldでの強制終了を避ける。というのもで、警告が出てる部分の記述を読む限りだと、VC++2008EEだと、 warning C4996: 'strcat': This function or variable may be unsafe. Consider using strcat_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. この機能は危険かもしれません。もし使いたいなら_CRT_SECURE_NO_WARNINGSを使ってください。と出ました。 警告文にもあるように、詳細はヘルプを見てくれとのことで、かなり探しましたが、記述方法が書いてないのです・・・。 まだ挑戦しますが・・・。
補足
なるほど。 makefileについて調べていたのですが、開発環境?みたいのを提供してる、MicrosoftのVisual C++とかだと、自動的にやってくれるみたいなの書いてありました。 原理はまだよくわかりませんが、興味でそれを試してみます。 少し時間がかかりそうですが、結果はお礼に書きますね。 ありがとうございます。
- jacta
- ベストアンサー率26% (845/3158)
> このソースをアップされた方は、匿名掲示板で自らファイルを配っていたのですが、問題ありそうでしょうか? > それとソースを一部しか公開していないので(偶然ではありますが)、おそらく問題なしかと思うのですが・・・。 著作権者が利用や再配布を明示的に許可していないのであれば、本人に問い合わせて許可を得るしかありません。それができないのであれば著作権侵害です。出処も明らかにされていないので、引用にすらなりません。
お礼
わかりました。 匿名掲示板ですが、なんとか問い合わせてみます。
- mtaka2
- ベストアンサー率73% (867/1179)
> ・この言語はC++でしょうか?もしくはbcc32でコンパイル可能でしょうか? 見るからにC言語です。MFCなんかは使っておらず素のWin32APIを使っているようですから Borland C++(bcc32) でもコンパイル可能である可能性が高いと思います。 Microsoft で試すなら、VisualC++ の方で。 > (文字制限を越えてしまったので、下半分を消しました) その消されている下半分が重要なのですが、 その中に、「main関数」と「WinMain関数」のどちらがありますか? それによって話は変わります。 以下、推測ですが、 stdio.h をinclude しているところを見ると、main関数が入ってる可能性が高いと思います。 もしそうだとすると、コンソールアプリケーションですから、 コマンドプロンプトから使うのが正しい利用方法であり、 > 結果、.exeファイルと、.objともう一つ(名前忘れた)ができて、うまくできたかと思い、起動してみたのですが、DOSが開いてすぐ閉じてしまいます。 これは、正しい動作ってことになります。 コマンドプロンプトから適切な引数を指定して実行してください。
お礼
まだ解決には至りませんが、またgoogle先生にお世話になったところ、makefileなるものがあるそうですね。 この元の実行ファイルはあるので、今は知識を深めたいと思って色々調べてるところなんですが、ここで仰ってる引数とは、.exeファイルや、ヘッダーファイルや、.objをコマンドプロンプトで呼び出せということですか?
補足
>見るからにC言語です。MFCなんかは使っておらず素のWin32APIを使っているようですから >Borland C++(bcc32) でもコンパイル可能である可能性が高いと思います。 >Microsoft で試すなら、VisualC++ の方で。 おお、そうですか、とても参考になります。 >コマンドプロンプトから適切な引数を指定して実行してください。 恥ずかしながらC言語を過去に習ったのですが、引数とはプログラムのどこかを指定して呼び出すことですよね? ぼんやり覚えてはいるのですが、かなり忘れてます・・・。 できたら具体例を頂けると大変ありがたいです。 さっそく回答してくださってありがとうございます。
- jacta
- ベストアンサー率26% (845/3158)
> ソースの言語がC++なのかC#なのかわかりません。 言語も分からないということは、ライセンスも分からない可能性が高いですね。 実際にどうなのかは分かりませんが、犯罪に加担することはできませんので、出処を明確にしてください。
補足
このソースをアップされた方は、匿名掲示板で自らファイルを配っていたのですが、問題ありそうでしょうか? それとソースを一部しか公開していないので(偶然ではありますが)、おそらく問題なしかと思うのですが・・・。 もしそういう問題でないということであれば考えさせていただきます。 ご意見くださいましてありがとうございます。
- koi1234
- ベストアンサー率53% (1866/3459)
>・この言語はC++でしょうか?もしくはbcc32でコンパイル可能でしょうか? >とりあえず、なにはともあれ試しにビルドしてみようと思い、bcc55でやってみました。 >結果、.exeファイルと、.objともう一つ(名前忘れた)ができて、うまくできたかと思い、起動してみたのですが、DOSが開いてすぐ閉じてしまいます。 実行モジュールもできているのであればコンパおる可能ですか?では無く コンパイル・リンクしてるわけですよね? (その実行モジュールがどのようなことを行っているかはわかりません) >Microsoft Visual C# Express Editionでも試してみました どうせやるならC++の方がいいかもしれません(大きな違いは無いかもしれないけど) 本当に一緒にあったexeがこのソースの実行モジュールなのかどうかも 質問文の内容だけでは定かではありません (Win32APIコールしてるんでプラットフォームはWindowsだとは思いますが)
お礼
>コンパイル・リンクしてるわけですよね? いま、3件回答を頂きまして、正直よくわからないのですが、予想で言いますと、まさにこの「リンク」について自分は知る必要があるのかもしれません。 >本当に一緒にあったexeがこのソースの実行モジュールなのかどうかも >質問文の内容だけでは定かではありません もしかすると、ある一部をカットして、主要部分だけソースを公開するケースもあるんですかね・・・。 一緒にあったexeファイルは開くと、DOSが起動して、コメントがでます。 そして、このソースを自分でコンパイルして起動したときとは違って、閉じません。 そう思いたくはないですが、一部カットされてるのでしょうか・・・。 とにかく、参考になりました。ありがとうございます。
お礼
自分はC言語を昔習ったのですが、そのときにソースを書いてコンパイルすると、exeが生成されて、そのまま使えると思い込んでました。 でも今回また調べなおして、それは違うって事がわかりました。 それで、結局のところなんですが、元々入ってたexeファイルと同じ動作をするファイルを生成することができました。 VC++2008EEだと、説明してるサイトも分かりにくかったので、BCC Developerを使用してるサイトを見ながらやってみました。 >リンクしているファイルの中にその関数が存在していない まさにこれが原因でした。 簡単な解決方法があったのでできました。 このソースが使うヘッダーファイルやライブラリを、全てプロジェクトの中間ファイルとかを出力するディレクトリにコピーしたらうまくできました。 たぶんちゃんとどこかの設定をできてれば、コピーしなくてもできるのでしょうが、自分にはわからなかったので、windows.hとかもコピーしました。 解決できてよかったです。 回答ありがとうございました。