プロが教える店舗&オフィスのセキュリティ対策術

atlstr.hのインクルードにより生じるエラーについて質問させて頂きます。

開発環境は、Visual Studio 2008 Professional Editionです。
(Visual Studio 2008におけるプログラミングは正直まだ慣れておりませんorz)

Visual Studio 2008製品内のVisual C++ 2008において、以下の操作を行いプログラムを
実行すると、コンパイルは通るのですが、プログラム実行後にエラー音が一度鳴るだけ
でフォームが表示されないというエラーが発生します。その際、タスクマネージャでプロセ
スを確認するとプログラム自体は動いているようで、”AtlStrTest.exe”というプロセスが実
行されているのが確認できます。


1.[ファイル]->[新規作成]->[プロジェクト]で新しいプロジェクトダイアログを表示させる
2.[Visual C++]->[CLR]->[Windows フォーム アプリケーション]を選択し、プロジェクト名
  ”AtlStrTest”でプロジェクトを新規作成
3.プロジェクト内に生成された”atdafx.h”の”// TODO: プログラムに必要な追加ヘッダー
  をここで参照してください。”というコメントの下に#include <atlstr.h>の一行を追加する


 原因を分析しようにも、ヘッダをインクルードしただけでエラーが起きるという状況がは
じめてなので、途方に暮れている状態です。

大変恐縮ですが、このatlstr.hのインクルードによるエラーがなぜ発生したのかについて、
どなたかアドバイスよろしくお願いいたします。


【関連情報】
 同様の操作を、Win32コンソールアプリケーションで実行したときは、このようなエラーは
出ませんでした

A 回答 (4件)

これまでに書かれた内容から、多分同じであろうというプロジェクトを作って見ました。



結果は、
Debugでは
VS上でデバッグ開始/デバッグなしで開始/exeで実行のいずれでもエラーメッセージ(Debug Assertion Faild! この下のメッセージは内容が判りませんでした。存在しないディレクトリのdbgheap.cを示していましたので)を出して、中止を選んでもプロセスが残ったままでした。すべて中止にすればプロセスも終了しました。

Releaseでは
デバッグ開始でハンドルされていない例外のエラー、デバッグなしで開始/exeで実行のいずれでもForm1が表示されました。
右上の閉じるボタンで終了しました。

Visual Studio 2008 Professional Version 9.0.30729.1 SP です。

結果だけで、原因と解決法はわかりません。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます!

samtomsan様のおっしゃる通り、Releaseモードではatlstr.hをインクルードし、CStringクラスを使用することができました!これで、やっと作成したプログラムを動かすことができます。本当にありがとうございます。

ただ、Debugにおいてエラーが発生する原因が不明なので、今後開発するプログラムではbluecampus様のアドバイスに従い、System::StringやEncodingを使用して行こうと思います。

Wr5様、redfox63様、bluecampus様、samtomsan様、この度は質問へのご回答に貴重なお時間を割いていただき頂き、誠にありがとうございました!!

お礼日時:2010/12/16 23:21

CStrinTを使う目的のみでのincludeだったら辞めて


System::Stringクラスを使うと、const char* 型(Shift_JIS文字コード配列)、const wchar_t*(Unicode文字コード配列)と変換できるので、
System::StringをShift_JISに変換するところだけ、Encodingクラス(PtrToStringCharsとかMarshalクラスとかでも)で行うとか。

全部Encodingクラスでもいいですけど。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

System::StringクラスとEncodingクラスを用いても、Shift_JIS文字コード配列とUnicode文字コード配列と間の変換が可能ということですので、今後はそれらのクラスを活用したいと思います!

ただ、現状といたしましては、すでにWin32コンソールアプリケーションプロジェクト下でCStirngを使用したプログラムの部品となるクラスを多数作成してしまっています。そのため、なるべくなら現在作っているプログラムまでは、CStringを使いたいというのが正直なところです…。

お礼日時:2010/12/15 22:30

atlstr.hをインクリュードして何を使いたかったのでしょう?


.NET側で用意されているもので代用が出来るかもしれないですよ

インクリュードしただけですが 関数のプロトタイプ宣言が仕様に反していればエラーになるのではと思います
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

atlstr.hは、CStringを使用するためにインクルードしておりました。
CStringを使用したい理由としては、ワイド文字とマルチバイト文字の変換が、MultiByteToWideCharや
WideCharToMultiByteと比べ簡単に行えるためです。

あと、関数のプロトタイプ宣言が仕様に反している場合のエラーですが、この場合エラーの内容はコマ
ンドラインに表示されないのでしょうか?

お礼日時:2010/12/15 09:41

手元のはVS2005Stdですが…



1>C:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\include\atlconv.h(90) : error C3641: 'InterlockedExchangePointer' : /clr:pure または /clr:safe と共にコンパイルされた関数に対する呼び出し規約 '__stdcall ' が無効です

って感じのエラーがいくつか出ています。
CLRではそういう使い方はできない…のでしょう。
# エラーメッセージ見る限りでは呼び出し規約が違う…ということっぽいですけど。

この回答への補足

ご回答ありがとうございます。

申し訳ありません、操作のステップを一つ忘れていました。
実際には、上記の3つのステップに加え、[プロジェクトのプロパティ]->[構成のプロパティ]->[全般]->[共通言語のランタイムサポート]において、[共通言語のランタイムサポート(/clr)]を選択する必要がありました。この処理を行わないと、私の環境においても、呼び出し規約が違うというエラーメッセージが表示されておりました。

補足日時:2010/12/15 09:22
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!