VC++ 2012でマシン語プロが作れません

このQ&Aのポイント
  • Visual Studio Pro 2012のVisual C++ 2012で作成したネイティブコード(マシン語)が他のコンピューターで動作しない問題が発生しています。
  • Windows 7 Ultimate 64ビットのPCでは正常に動作しますが、別のWindows 7 Ultimate 64ビットのPCではMSVCP110D.dllがないためプログラムが開始できず、Windows PE 3.1で起動したPCでは必要なサブシステムがないため動作しません。
  • 問題の原因は、正しいネイティブコードが出力されていない可能性や誤解による間違いなど複数考えられます。経験者のアドバイスをお願いします。
回答を見る
  • ベストアンサー

VC++ 2012 でマシン語プロが作れません

Visual Studio Pro 2012 の Visual C++ 2012 でネイティブ コード(マシン語)を作ったつもりなのですが、他のコンピューターで動きません。詳細を以下に記しますので、皆様のアドバイスをお願いします。 VS 2012 インストール環境:Windows 7 Ultimate 64ビット VC++ プログラム:秀和システム発行 「Visual C++ 2010」 47ページに記載されているコンソールアプリケーション用の次のプログラム #include “stdafx.h” #include <iostream> using namespace std; int main() { cout << “Hello World!” return 0; } 動作時の現象 1. VS 2012 をインストールしてあるPCでは問題なく正常動作します。 2. VS 2012 をインストールしてない別のPC2台(Windows 7 Ultimate 64ビット)では、次のメッセージが表示され、動作しません。 「コンピューターに MSVCP110D.dll がないため、プログラムを開始できません。この問題を解決するには、プログラムを再インストールしてみてください。」 3. Windows PE 3.1 で起動した別のPCでは次のメッセージが表示されます。 「この種類のイメージのサポートに必要なサブシステムがありません。」 2と同じことを言っているようです。 MSVCP110D.dll は、VC++ のインストールで sytem32 フォルダーに3種類のCPU (x86、x64など)用のファイルが自動的にインストールされています。 私の感覚で一番疑わしいのは、正しいネイティブ コードが出力されていないのではないかと考えるのですが、上記秀和システム発行の図書の、38ページで「・・・ネイティブプログラミングをメインに解説し、巻末でC++/CLIプログラミングの解説を行う」と書いてあるので、図書の指示に従えば、マシン語のプログラムが完成するものと考えられます。 次に疑わしいのは、私の誤解による間違いです。 状況は以上の通りです。私の能力では、解決不可能です。経験者のご支援をお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • okgoripon
  • ベストアンサー率44% (1141/2550)
回答No.2

突っ込みどころ満載なんで総スルーして問題だけ解決します。 以下のURLでダウンロードできる「再頒布可能パッケージ」を、動かすPCにインストールしてください。 VC2010の無印かSP1か、またx86(32bit)かx64(64bit)かで分かれています。 無印 32bit http://www.microsoft.com/ja-jp/download/details.aspx?id=5555 SP1 32bit http://www.microsoft.com/ja-jp/download/details.aspx?id=8328 無印 64bit http://www.microsoft.com/ja-jp/download/details.aspx?id=14632 SP1 64bit http://www.microsoft.com/ja-jp/download/details.aspx?id=13523

Agusuke
質問者

お礼

okgoriponさん、ご親切な回答ありがとうございます。 私の理解不足を痛感しました。「Visual C++ 再頒布可能パッケージ」の文言は何度か目にしたことがありますが、全く気にしていませんでした。 VC++ で作成したモジュールをそのまま配布(コピー)すれば動くのだと思い込んでいました。 ご親切に感謝します。

その他の回答 (4)

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.5

そこで言っている「ネイティブコード」ってのは、.NetFrameworkとかを使用しない。 って意味でしかありません。 マシン語で~という言い方はさらに正しくありません。 マシン語とか言ったらハンドアセンブルなりして16進の羅列になりますよ。 せいぜいアセンブリ言語じゃないですかね? んで、掲示されているのはただのC++言語です。 VS2012がインストールされていない環境で動かない。 ってのは既に回答されているようにランタイムライブラリがインストールされていないからです。 VSのバージョン毎にインストールが必要になるもので…毎回こういう質問が出てくるくらいおなじみなネタです。 んで、やはり既に回答がありますが、「デバッグ版」は他の環境へ持って行くのは正しくありません。 # DLLだけコピーして~とかやろうとする人もいますが、デバッグ版のDLLを勝手に他のマシンにコピーするのはライセンス上問題があったかと。 リリース版でビルド(添付画像でReleaseを選択してビルド)して、対象PCにはランタイムを別途インストールする。 と言うのが正しいです。

  • maia55jp
  • ベストアンサー率61% (327/535)
回答No.4

やりたいことは、ネイティブプログラミングじゃなくコンソールアプリじゃないかと Win用のネイティブプログラミングだと意味が違ってきますし、C++解説本の様なので コンソールアプリで問題無いかと・・・ VC++入門 コンソールアプリケーションの作成(バージョンが古いですが) http://mcn-www.jwu.ac.jp/~yokamoto/openwww/cpp/introvcppc/ マシン語とは、本当に16進数を書き込んでいく形になり、一般的にはマシン語と対になる アセンブリ言語を使用します。 インラインアセンブラで学ぶアセンブリ言語 第1回 http://codezine.jp/article/detail/393 最近、Java中心なので何ともなのですがコンソールアプリだとMSVCP110D.dllは不要なはず・・

  • neKo_deux
  • ベストアンサー率44% (5541/12319)
回答No.3

> Visual Studio Pro 2012 の Visual C++ 2012 でネイティブ コード(マシン語)を作ったつもりなのですが、 標準の設定だと、ライブラリの静的リンクは行なわれず、プログラムの実行時にライブラリを動的にリンク、参照する実行形式(.exe)が作成されます。 ダイアログとか文字列の標準出力とかの処理をそういう共通モジュールに行なわせ、プログラムのサイズを小さくするなんかのメリットがあります。 ネイティブコードって定義が不明瞭ですが、dll無しに動作する実行形式を作成するためには、自分はVS2012は持ってないですが、プロジェクトの設定でそういう物を静的リンク、スタティックリンクする設定に変更する必要があるハズ。 > 2.VS 2012 をインストールしてない別のPC2台(Windows 7 Ultimate 64ビット)では、次のメッセージが表示され、動作しません。 最近のWindowsは標準でVC++用のランタイムが入ってないそうなので、そちらをインストールする必要があります。 Visual Studio 2012 更新プログラム 1 の Visual C++ 再頒布可能パッケージhttp://www.microsoft.com/ja-jp/download/details.aspx?id=30679 | Visual C++ 再頒布可能パッケージは、Visual Studio 2012 を使用して開発されたアプリケーションを Visual Studio 2012 がインストールされていないコンピューター上で実行するために必要な、Visual C++ ライブラリのランタイム コンポーネントをインストールします。 > 「コンピューターに MSVCP110D.dll がないため、 VC++6.0とかの話だと、△△△D.dllはデバッグ用のdllです。 通常のVC++ランタイムをインストールしても、デバッグ用のランタイムまでは入りません。 リリース用の実行形式を使ってください。

Agusuke
質問者

お礼

neKo_deuxさん、ご親切な回答ありがとうございます。 私の理解不足を痛感しました。「Visual C++ 再頒布可能パッケージ」の文言は何度か目にしたことがありますが、全く気にしていませんでした。 VC++ で作成したモジュールをそのまま配布(コピー)すれば動くのだと思い込んでいました。 ご親切に感謝します。

  • masatsan
  • ベストアンサー率15% (179/1159)
回答No.1

それってマシン語じゃないんだけど。 VCでマシン語書きたければ、本当にマシン語で書かないとだめじゃないの? VCなので当然ランタイムが必要になります。

Agusuke
質問者

補足

masatsan、回答ありがとうございます。Visual Studio は、Microsoft で唯一のネイティブ コード(マシン語)の作れるIDEと言われています。VC++は、.NetFramework 用のCLI(masatsanの言われるランタイム)を利用したアプリケーション開発用としての利用が主流ですが、アンマネージのC環境も含まれており、マシン語プログラムも作れる特徴が1つの売りになっていると解釈しています。このことは、有名な『猫でもわかる・・・』にも記載されており、間違いないと思います。 ネイティブ コードに挑戦するのは、初めてなので、私も経験がありません。

関連するQ&A

  • VC++2010のmsvcp100.dllについて

    私は、windows7 64bitで「Microsoft Visual C++ 2010 Service Pack 1 Compiler Update for the Windows SDK 7.1」や「Microsoft Windows SDK for Windows 7 and .NET Framework 4」 をインストールしました。 しかし、Message: Visual Studio C++ 2010のProgram Files (x86)\Microsoft Visual Studio 10.0\VC\redist\x86\Microsoft.VC100.CRT\msvcp100.dllが見当たりません。redistフォルダ自体が存在しません。 どうすれば、Program Files (x86)\Microsoft Visual Studio 10.0\VC\いかにredistフォルダとmsvcp100.dllを作成することができますか?

  • windows10でVC6.0++のclを使いたい

    cl.exeの場所:C:\Program Files\Microsoft Visual Studio\VC98\Bin 環境変数INCLUDE設定:C:\Program Files\Microsoft Visual Studio\VC98\Include 環境変数LIB設定:C:\Program Files\Microsoft Visual Studio\VC98\Lib を登録したのですが、mspdb60.dllがないといわれました。 検索したらあるのですが、 どうすれば、Windows10でvc6.0++のCコンパイラを使えますか? 教えてくださいよろしくお願いします。

  • VC++ iostreamの不具合(?)

    手強いVC++のエラーです(対処が効かない #include <iostream> int main () {cout << "ggrks"; return 0;} C2065エラー 'cout' : 定義されていない識別子です。 #include <iostream.h> int main () {cout << "Hello C++!"; return 0;} C1083エラー include ファイルを開けません。'iostream.h': No such file or directory iostream(拡張子無)はCドライブのプログラムファイル、Microsoft Visual Studio 9.0\VC\includeに存在してます。 パスは許可してあります。 ツール→VC++ディレクトリ→インクルードファイルで C:\Program Files\Microsoft Visual Studio 9.0\VC\include と C:\Program Files\Microsoft Visual Studio 9.0\VC\include\iostream もついでに。 インストが完全でなかったのかと思い、「修復又は再インストール」で再インストしましたが変わりません。 気分転換(?)に一回アンインストールしてから再インストール(あまり意味ありませんけど)しても同様です。 どうすれば良いでしょうか。ご教授願います。

  • 実行体を別のマシンで実行させたい

    Windows Vistaマシン(PC)にインストールしたVisual Studio 2005でVC++により作製した実行体を、素の(Visual Studio 2005がインストールされていない)Windows XPマシン(PC)で、実行させたく存じます。 まず、Windows VistaマシンおよびインストールされているOSの詳細は、下記の通りです。 PC:プロセッサ  →Intel Core2 Duo CPU T7250 @ 2GHz   メモリ    →2GB   システムの種類→32bit OS OS:Windows Vista Home Premium SP2 次に、インストールしたVisual Studio 2005の詳細は、下記の通りです。 Visual Studio 2005:Version8.0.50727.867(vsvista.050727-8600) .NET FRAMEWORK :Version2.0.50727 SP2 次に、Windows XPマシンおよびインストールされているOSの詳細は、下記の通りです。 PC:プロセッサ  →Intel Celeron M processor @ 1.3GHz   メモリ    →512MB   システムの種類→32bit OS OS:Windows XP Home Version2002 SP3 次に、作製した実行体は、Visual C++ プロジェクトから「MFCアプリケーション」を選択し、Vistaマシン上でダブルクリックで実行するとウィンドウが発生し、ウィンドウ内には、ボタンが1つおよび入力テキストが1つ存在して「テキスト入力してOKならば、OKボタンを押下する」程度の簡単なプログラムをリンクしたものです。以下の要領でXPマシン側に実行体を移動し、実行体をダブルクリックで実行させようとしたのですが、いずれも「このアプリケーションの構成が正しくないため、アプリケーションを開始できませんでした。アプリケーションを再度インストールすることにより問題が解決することがあります。」というダイアログが出現し、実行に失敗しました。以下、この実行体名を「text_input.exe」と称して失敗例を記述します。 1.「text_input.exe」をそのままXPマシンのROOTの直下に置いて実行した → NG 2.XPマシンに、   ・Microsoft .NET Framework Version 2.0 再頒布可能パッケージ (x86)   ・Microsoft .NET Framework 2.0 日本語 Language Pack (x86)   ・Microsoft Visual C++ 2005 再頒布可能パッケージ (x86)  をインストールした後、「text_input.exe」をXPマシンのROOTの直下に置いて実行した → NG 3.「text_input.exe」を作製する際、「stdafx.h」内で、#pragma宣言をして下記のファイルもリンクした   #pragma comment( dll, "C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT\msvcm80.dll" )   #pragma comment( dll, "C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT\msvcp80.dll" )   #pragma comment( dll, "C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT\msvcr80.dll" )   #pragma comment( manifest, "C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT\Microsoft.VC80.CRT.manifest" )   #pragma comment( dll, "C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.MFC\mfc80.dll" )   #pragma comment( dll, "C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.MFC\mfc80u.dll" )   #pragma comment( dll, "C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.MFC\mfcm80.dll" )   #pragma comment( dll, "C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.MFC\mfcm80u.dll" )   #pragma comment( manifest, "C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.MFC\Microsoft.VC80.MFC.manifest" )     その後、上記2項の状態のXPマシンのROOTの直下に「text_input.exe」を置いて実行した → NG いよいよ手立てがなくなりました。Windows並びにVisual Studioに精通されている方がおりましたら、素のWindows XPマシンで動作させる方法をご教示頂きたく、お願いいたします。

  • VC9でHellowWorldが動かない。

    表題の通りです。 今日、VC8からVC9に移行したのですが、どれをビルドしても、 「MSVCP80.dllが見つからないため~」 というメッセージボックスが表示されたため試しに、 HellowWorldをやってみましたがやはりそうなります。 //HellowWorld.cpp #include <stdio.h> int main() {  printf("HellowWarld"); } 調べてみたところ、 「Microsoft Visual C++ 2008 再頒布可能パッケージ (x86) (http://www.microsoft.com/downloads/details.aspx?familyid=9B2DA534-3E03-4391-8A4D-074B9F2BC1BF&displaylang=ja)」 を入れると直るとのことですが、直りません。 widows/WinSxSから、msvcp80.dll,msvcr80.dllなどを直接HellowWorld.exeがあるところに入れてみましたが、 「正しいwindowsイメージではありません」 もしくは 「RuntimeError (中略) R6034 An applcation has made an attempt to load the c runtime library incorrectly」 とでます。 一体どうすれば、この問題を解決できるのでしょうか? 環境は上記の通りVC9です。 よろしくお願いします。

  • VC#とVC++の両方を使いたいんですが・・・

    今まではMicrosoft Visual C# 2008 Express Edition(以下VC#)だけである程度の開発を進めてきましたが、今後はOpenCVをC#で使いたいと考えています。 OpenCVに関する本やWebページを見ても、Microsoft Visual C++ 2008 Express Edition(以下VC++)を例にするものしかありませんでした。 Webページで、VC++を使って、ビルドしたあとdllファイル(?)をC#に読み込むことで、C#でOpenCVを使えるという記述を見つけたため、VC++もインストールしました。 しかしVC++をインストールする際、以下のようなコメントが出てきました。 --- コンポーネントが既に別の場所に保存されているか、別の場所に保存されたファイルに依存しているため、このコンポーネントまたはサブコンポーネントの場所を変更できません。 以下のプログラムが原因でファイルが統合されようとしています: Microsoft Visual C# 2008 Express Edition with SP1 - JPN ファイル パスを変更するには、上の一覧にあるプログラムをアンインストールしてから、Visual Studio と共有しているファイルを格納する場所に再インストールしてください。 --- もしかしたらSP1はインストールしなかったのかもしれません(チョット記憶が曖昧ですみません)。 実際、VC++でOpenCVを使ったプログラムを書いた際、ビルドは出来るものの、デバッグすると以下のようなコメントが出てしまいます。 アプリケーションを正しく初期化できませんでした(0xc0150002)。[OK]をクリックしてアプリケーションを終了してください。 これはSP1が使える状態になっていない(インストールされていない)ということなのでしょうか? 先ほども書いたとおり、VC#である程度の開発が進んでいるため、アンインストールをしてプログラムが使用不可能になってしまうことを恐れ、アンインストールをためらっています。 アンインストールと再インストールをしたとして、どこの設定を変えれば再度使えるようになるのかを教えていただけますか? あまりパソコンやVC++、VC#を詳しく知らないので、詳しく教えていただけると嬉しいです。

  • VC++6.0からVC++2010への移行

    マシンAの VC++6.0 から マシンBの VC++2010 へ移行し、Releaseモード でビルドした結果、正常動作しませんでした。 Releaseモード、Debugモード ではエラー、警告ともにありません。 ■ 6.0 と 2010 パラメータ ■ ・共有 DLL で MFC を使う ・マルチスレッド DLL ・警告レベル 3 ■マシンA環境■ ・Windows XP Professional 2002 Service Pack 2 ・.NET Framework 1.1 ・Visual Studio 6.0 Enterprise Edition ■マシンB環境■ ・Windows XP Professional 2002 Service Pack 3 ・.NET Framework 1.1 、2.0 、3.0 、3.5 、4.0 ・Visual Studio 2005 Professional Edition ・Visual Studio 2010 Professional Edition ・Visual C++ 2008 Redistributable 作業の経緯と致しましては、6.0 のプロジェクトを VS2008 でビルドし、 sln ファイルを生成しました。 その後、生成された sln ファイルをもとにVS2010でエラーと警告の解除作業をしました。 Debugモード で エラー、警告 がないことを確認し、Releaseモード でビルドした結果、現状に至っております。 マシンB環境で問題なく 6.0 プログラムが動作している(Debug、Releaseともに)ことから環境面に原因があると考えております。 どのような問題が考えられるのか、また、どのような調査を行うべきか、ご教示頂きたいです。 よろしくお願い致します。

  • VC++のDLLファイルをVBで読み出せません。

    お世話になります。 プログラムをやり始めて3か月の初心者です。仕事で以下のような事をしていますが、うまくいかず悩んでいます。 プログラム(1):VB 2008年版 メインプログラム プログラム(2):C言語 2006年版 プログラム(3):VC++ VISUAL STUDIO2012 EXPRESSを使用 ■今のプログラム (2)のdllファイルを(1)で呼び出しています。問題なく動きます。 ■やりたい事 (2)のプログラム内容を変更したのが(3)です。そのdllファイルを(1)で呼び出したいです。 ⇒しかし、(3)のdllファイルを読み込むことができません。((3)のdllファイルは作れました。) (3)はVC単独では正しく動作します。 (1)のプログラムに、(2)を呼び出すときと同じように(3)用のプログラムを追加しました。作った(3)のdllファイルは指定したフォルダにきちんと入れています。 コンピューターに詳しい先輩が時間をかけてみてくれたのですが、結局わからずじまいでした。 ■質問 VBの型が古い、EXPRESSを使っているからできないのでしょうか? VCでdllを作って、VBで呼び出すまでの流れをわかりやすく紹介した書籍やWEBなどあればご教示頂けませんでしょうか? よろしくお願いいたします。

  • windows8.1エラー

    「コンピューターにMSVCP120.dllがないため、プログラムを開始できません。・・・」 とエラーが出てきたので調べてみたら Microsoft Visual Studio 2013のVisual C++ 再頒布可能パッケージのインストールが必要 ということでインストールしてみると 「0x80070652]とエラーが出ました。 どうすればいいですか。

  • msvcr71.dll と msvcp71.dll

    msvcp71.dllは、C+ランタム msvcr71.dllは、Cランタムという プログラムですが、ソフトウェアを動作させる際に必要となるファイルでなにかのアプリケーションでインストールされるそうですがどんなときにインストールされるのでしょうか。 ネットで調べてみると、 「Microsoft C++ Runtime Library」とありますが。どのタイミングでインストールされるのか。 msvcp71.dllは、C+ランタム msvcr71.dllは、Cランタムが入っているPCと入っていないPCがあるのですが。なぜバラバラなのか。

専門家に質問してみよう