トップページ⇒tech
971コメント269KB

managed C++ やろうぜ!!

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
C#関連のスレは山ほどあるが
managedC++のスレが無いじゃないか。
折角.NETに生き残ったC++、みんなで語ろうぜ。
0183デフォルトの名無しさんNGNG
C++から.NETを使いたい。ってそんなにマイナーなニーズ?
MFCだってあとは現状維持程度で、新しいことがしたければ.NETへ逝け!でしょ?

おれは今のところWindowsは開発対象でないので様子見。
0184180NGNG
原因はこれです
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/vcerrLinkerErrorLNK2023.asp
だけど解決方法が分かりません。Link.exeに正しく
E:\Program Files\Microsoft Visual Studio .NET\Common7\IDE\msobj10.dll
を読み込ませる方法はないでしょうか?
0185180NGNG
自己レス。
E:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\msobj10.dll
を上の.netSDKのDLLで上書きしたらLNK2023は出なくなりました!

という訳でVS6、.netSDK、PlathomeSDKの三つを上手く組み合わせれば
まだまだ開発はできそうです。
0186デフォルトの名無しさんNGNG
をいをい、%LIB%直せよ。。
0187デフォルトの名無しさんNGNG
VC.NETはlokiをコンパイルできるのですか?
というかtemplateの制限はどれくらい解けてます?
0188デフォルトの名無しさんNGNG
VC.NETはloliをコンパイルできるのですか?
0189デフォルトの名無しさんNGNG
>>187
それなりに解けてる
0190180NGNG
>>186
%LIB%にパスを設定したけどダメなんですよ。なんでですかね?
0191デフォルトの名無しさんNGNG
C#ってVBの関数使えるらしいけど、managed C++は使えるの?
0192デフォルトの名無しさんNGNG
.NETの関数、という意味ならどの言語だろうが同じなのでは。
0193デフォルトの名無しさんNGNG
>>192
ほう・・・VBが使えるVC・・・訳わからんな。
0194デフォルトの名無しさんNGNG
>>192
だよな。
カーネル内の関数をVC++で作成したものだろうがVBで作成したものだろうが呼び出せるのと同じだよな。
0195194NGNG
カーネルじゃなくてDLLの方がいいか。
0196デフォルトの名無しさんNGNG
managed C++まじで分らん。誰か助けて!
0197デフォルトの名無しさんNGNG
>>196
やだ
0198デフォルトの名無しさんNGNG
>>196
C#やれ
0199デフォルトの名無しさんNGNG
>>196
質問書けよ。助けて!じゃわからん。
0200デフォルトの名無しさんNGNG
managed C++でやれることは
unsafeキーワード使うことで
全てC#でできるんですか?
0201デフォルトの名無しさん NGNG
unsageって前はマネージドコードってことになってなかったっけ?
0202デフォルトの名無しさんNGNG
多重継承とかは?
0203デフォルトの名無しさんNGNG
>>202
それはそもそもmanaged c++にはない
0204デフォルトの名無しさんNGNG
ms-help://MS.NETFrameworkSDK.JA/vcmxspec/html/vcManagedExtensionsSpec_1.htm
0205デフォルトの名無しさんNGNG
>>201
unsage = age
0206デフォルトの名無しさんNGNG
・アクセスと制御。
マネージ コードとアンマネージ コードを混在できるため、
下位レベルのアンマネージ API などに直接アクセスできます。
Visual C++ とマネージ拡張を使用して、最大パフォーマンスの
マネージ API を記述できます。

この辺りしかmanaged C++を使う理由はないな。
C#でも十分パフォーマンスをあげるコーディングの仕方が
用意されてるみたいだし。またx86ネイティブなコードを
書く機会もWindowws上じゃ減るんだろうなぁ。
0207デフォルトの名無しさんNGNG
>>206
MC++のメリットって、APIの構造体(またはクラス)を直接使えることぐらいじゃないかな。
APIの引数の型が単純だったら、C#とかでも難なく使えるし。
0208デフォルトの名無しさんNGNG
>>200
いいえ。C#は何でもできる言語ではありません。VB.NETでできるのにC#では
できないこともあります。MC++でならできるけど、C#やVB.NETではできない(または限定的)と
いうこともあります。

>>206さんの言うことは一部真だと思いますが、C++ユーザーがC#に進んで混乱するくらいなら
MC++のほうがいいという選択もありえると思います。
0209デフォルトの名無しさんNGNG
>>207
ちなみにMC++のアンマネージコードの呼び出しはP/Invokeではありません。
P/Invokeよりも数十倍高速な仕組みを利用します。
0210207NGNG
>>209
ああ、そういやそんな話があったね。IJWって言うんだっけ?
0211デフォルトの名無しさんNGNG
ms-help://MS.NETFrameworkSDK.JA/vcmxspec/html/vcmg_PlatformInvocationServices.htm
この辺りかな?
とにかく高速なラッパーという用途だけはC++に残っているわけね。
0212デフォルトの名無しさんNGNG
unsage!
0213デフォルトの名無しさん NGNG
unsage!
0214デフォルトの名無しさんNGNG
既存のアプリケーションをマネージドに移行するのに注意する点なんてありますか?
0215デフォルトの名無しさんNGNG
関係ないですが、"managed C++"を日本語でGoogleから検索すると
かなり上位に出てきます。
0216デフォルトの名無しさんNGNG
>>214
unmanagedコードを使わないようにがんばろう。
0217デフォルトの名無しさんNGNG
MFCとかATLをmanagedコードにすることは可能なの?
0218デフォルトの名無しさんNGNG
ムリ!
0219デフォルトの名無しさんNGNG
ナンデ!!
0220デフォルトの名無しさんNGNG
>>217
/clr つければできるよ。一緒に使えないオプションが多くて面倒だけど。
0221デフォルトの名無しさん NGNG
MC++ってごちゃごちゃしててまじでワケワカラン
0222デフォルトの名無しさんNGNG
とりあえず、新規のプロジェクトでMC++を使うことはないって言うのが
よく分かったよ。
0223デフォルトの名無しさんNGNG
C++死滅スレでも作る?
0224デフォルトの名無しさんNGNG
MC++死滅スレなら。
0225デフォルトの名無しさんNGNG
>>224
VC++に関していえば、
過去の資産を引き継ぐという意味じゃ、
互換性を切り捨てたVBとは役割は全然違う。
10年はなくならない。
それにMC++は多分内部的にかなりC#とコードを
共有してるような気もするから、なくなることは
ないと思う。

あくまで希望的観測だけどどうでしょう?
0226デフォルトの名無しさんNGNG
>>225
MC++ -> MSIL -> C#
いいデコンパイラが出れば良い線行くかも。
MC++ -> MSILとC# -> MSILが似ていれば。
0227デフォルトの名無しさんNGNG
既存のアプリケーションをコンパイルして気が付いたけど、
FILETIME(WinBase.h)とSystem::Runtime::InteropServices::FILETIME
みたいに名前がかぶっちゃうようか場合はどうしてる? 
0228デフォルトの名無しさんNGNG
ms-help://MS.NETFrameworkSDK.JA/vcmxspec/html/vcmg_AmbiguousReferences.htm
0229デフォルトの名無しさんNGNG
>>228
解決しました。どうもです。
0230デフォルトの名無しさんNGNG
ところで普通のアプリに
・使用するDLLを#pragma comment(lib, "XXX.lib")と指定する。
・使用する.net frameworkのDLLをusing <XXX.dll>と指定する。
とこれだけでいいんでしょうか?

しかもやってて思ったのは::MessageBox関数みたいに#define
切られてるのはどうしようもないような気がしてきました。
System::Windows::Forms::MessageBoxWはありませんとか言われて・・・
0231デフォルトの名無しさんNGNG
>>230
dllなのに拡張子libとは?
0232デフォルトの名無しさんNGNG
>>231
LINK : fatal error LNK1104: コンパイラは、ファイル 'kernel32.dll' を開くことができません
こうなっちゃうんですよ。

ところでこうやってコンパイルしたプログラムはmanagedってことに
なるんですかねぇ?もちろん全て__nogcという意味でいいのですが。
なんかMC++ってなんなのかよく分りません。
ildasm.exeでもちゃんと見れるからどうなってるのかさっぱりです。
0233デフォルトの名無しさんNGNG
>>231
#pragma comment(lib, "kernel32")
これでOKでした。拡張子は入りません。
0234デフォルトの名無しさんNGNG
それにしても盛り上がらないですねー。
既存のプログラムをC#で書き直すぐらいなら
MC++を活用した方が全然いいと思うのですが、、、

これでDLLを作ればC#なんかからusing MyLib;
なんて出来ていいと思うのですが。
0235デフォルトの名無しさんNGNG
>>234
ライブラリの移植用としては上の方で語られているね。
すくなくとも.NET用に開発されたC#がもっとも.NETとの親和性が高い。
0236デフォルトの名無しさんNGNG
>>235
個人的にはSun派とMS派のどっちでもないけど、
.netが過去との互換性を重視してる点がいいと思うんですよ。
MC++あっての.net(w
0237デフォルトの名無しさんNGNG
>>236
俺は心機一転派なのでC#のパイオニアを目指すw
0238デフォルトの名無しさんNGNG
そういう意味じゃg++が.net対応して保水
0239デフォルトの名無しさんNGNG
>>238
最強だね。それ。
0240デフォルトの名無しさんNGNG
今あるWindowsの.net frameworkと同等のmonoを作るだけで
最低でも10年はかかるんだろうなぁ。opensource is always late
なんてAlan Coxさんが言ってたけどまさにそんな感じか、、
0241デフォルトの名無しさんNGNG
MC++やろうぜ!
0242デフォルトの名無しさん NGNG
だれも盛り上げないから独り黙々と情報提供

【Essential Guide To Managed Extensions For C++】
http://www.amazon.com/exec/obidos/ASIN/1893115283/

【Managed C++ and .NET Development】
http://www.amazon.com/exec/obidos/ASIN/1590590333/

【Visual C++(r).NET Developer's Guide】
http://www.amazon.com/exec/obidos/ASIN/0072132817/

【Programming with Microsoft Visual C++ .NET, Sixth Edition (Core Reference)】
http://www.amazon.com/exec/obidos/ASIN/0735615497/

GotDotNetのMC++
http://www.gotdotnet.com/team/cplusplus/
http://www.gotdotnet.com/team/upgrade/c++.aspx

0243デフォルトの名無しさんNGNG
一冊漏れてた
【Microsoft Visual C++ .NET Step by Step】
http://www.amazon.com/exec/obidos/ASIN/0735615675/

COMとの相互運用に関して特化した本
【.NET and COM: The Complete Interoperability Guide】
http://www.amazon.com/exec/obidos/ASIN/067232170X/

C++プログラマたるもの、内部について無知は許されない!
【Inside Microsoft .NET IL Assembler】
http://www.amazon.com/exec/obidos/ASIN/0735615470/

【Compiling for the .NET Common Language Runtime】
http://www.amazon.com/exec/obidos/ASIN/0130622966/

【Essential .NET: The Common Language Runtime (Volume 1)】
http://www.amazon.com/exec/obidos/ASIN/0201734117/

発売してないものも含まれているので注意してください。

それにしても思ったより少ない気もする・・・
0244デフォルトの名無しさんNGNG
>>243
これからでそ
0245デフォルトの名無しさんNGNG
managed C++でILを吐かせることはできるんですか?
0246デフォルトの名無しさんNGNG
>>245
もちろん。そのための「M」ですから。
0247デフォルトの名無しさんNGNG
>>245
/CLRオプションを付けたときはデフォルトでmanagedコードに
なるみたいですが、managedコード=ILという訳ではないんですよね?
どうもGCとmanagedとILの関係が分らんのです。

x86バイナリにコンパイルされたC++managedコードにGCの機能が含まれて
いるっていう組み合わせもありえるんですよね?
0248デフォルトの名無しさんNGNG
PreJITと実行時ILコンパイルに質的に差がないのは理解してます。

C#に負けるな、あげ!
0249デフォルトの名無しさんNGNG
>>247
/clrでmanaged codeを吐くよ。managed codeって目に見えるものじゃなくて
概念的なものだと思う。ILであることもmanaged codeの一側面ではあるけど。

__gcのクラスはmanaged dataになる。managed dataとmanaged codeの違いは
意外にみんな理解していないようだ。

x86バイナリのlibをリンクしても、それがmanagedになるわけじゃないよ。
CLRはunmanaged codeを実行することもできるんだよね、これも意外に
知られていないが。
0250デフォルトの名無しさんNGNG
>>249
難しいです。なにかよいドキュメントがあればぜひお願いします。
0251デフォルトの名無しさんNGNG
ドキュメントから抜いてきました。

managed data 【マネージ データ】
共通言語ランタイムによって有効期間が管理されるオブジェクト。
共通言語ランタイムはオブジェクトのレイアウトを自動的に処理し、
それらのオブジェクトへの参照を管理し、不要になったオブジェクトを解放します。

managed code 【マネージ コード】
共通言語ランタイムとの "連携のコントラクト" に従って実行されるコード。
マネージ コードは、ランタイムがメモリ管理、言語間の統合、
コード アクセス セキュリティ、オブジェクトの有効期間の自動管理などの
サービスを提供するために必要とするメタデータを提供する必要があります。
Microsoft Intermediate Language (MSIL) に基づくコードはすべて、
マネージ コードとして実行されます。

unmanaged code 【アンマネージ コード】
共通言語ランタイムの規則および要件に関係なく作成されたコード。
アンマネージ コードが共通言語ランタイム環境で実行される場合は、
最小限のサービスで実行されます。たとえば、ガベージ コレクションは
実行されず、デバッグ機能も限定されます。


これから考えると、いわゆるmanaged C++っていわれてるプログラムは
managed dataとmanaged codeの規約を満たしているっていうわけですね。
ILかx86バイナリかどうかに関係ないく。GC云々の話は規約を満たしている
managed codeが生成したmanaged dataにおいて可能ということですか。
そして規約外のコードが全てunmanaged code。

となると、既存のC++プログラムを/CLRオプションでコンパイルした場合は、
例えそこからunmanaged codeを呼び出していたとしてもmanagedになる、
ってことですね。


もっと勉強しないと。。。
0252デフォルトの名無しさんNGNG
ms-help://MS.NETFrameworkSDK.JA/csref/html/vclrfunsafe.htm
ところがどっこい、C#ではポインタを使うためにunsafeキーワードを
使うと、アンマネージドになってしまうらしい。

C#ではポインタの使えるマネージドコードというのは記述できないのかな?
それとも上のドキュメントの記述が紛らわしいだけなのか、、
0253デフォルトの名無しさんNGNG
>>252
綺麗に線引きするには内部の動作を把握してないと無理。
だからみなあいまいな説明しかできない。
0254デフォルトの名無しさんNGNG
>>252
アンセーフとアンマネージは違う。アンセーフはマネージコードです。
CLRはマネージコードを実行します。アンマネージコードも一部実行できます。
アンセーフはマネージですから完全にCLRの傘下で実行されます。
0255デフォルトの名無しさんNGNG
>>230
マクロを #undef するよろし。
0256デフォルトの名無しさんNGNG
MC++とJava(JNI)で連携できた。(・∀・)イイ!
0257デフォルトの名無しさんNGNG
.NETとJavaとネイティブコードを混ぜられるのはC++だけ。C++最強!
0258デフォルトの名無しさんNGNG
MC++で COMって書けるの?
厨でrjc
0259デフォルトの名無しさんNGNG
>>258
ATLで /clr をつければできると思う。
0260デフォルトの名無しさんNGNG
>>255
それしかないんだけど、なんかきたないね
0261デフォルトの名無しさんNGNG
MC++やろうぜ!

1はどこいった?(ワラ
0262デフォルトの名無しさんNGNG
↓で new Size のところ、フルネームにしないとコンパイルエラーに
なるんだけどなんでだろ・・・?

using namespace System;
using namespace System::Drawing;
using namespace System::Windows::Forms;

__gc class Form1 : public Form
{
public:
  Form1()
  {
//   this->Size = *__nogc new Size(400, 300);
    this->Size = *__nogc new System::Drawing::Size(400, 300);
  }
};

[ STAThread ]
int __stdcall WinMain(void)
{
  Application::Run(new Form1);
  return 0;
}

/*
cl /CLR /FU mscorlib.dll /FU System.dll /FU System.Drawing.dll
/FU System.Windows.Forms.dll Form1.cpp
*/
0263262NGNG
IL的に面倒なことになってるのでちょっと修正。

  Form1()
  {
//   Size s(400, 300);
    System::Drawing::Size s(400, 300);

    this->Size = s;
  }
0264デフォルトの名無しさんNGNG
>>263
FormにSizeプロパティがあるのと関係?
0265262NGNG
>>264
あ〜、そういうことですか。Fontクラスもだめでした。
this->Size と System::Drawing::Size の判断ができないのか・・・。萎え。ヽ(´Д`)ノ
それはともかく、ありがとうございます。
0266デフォルトの名無しさんNGNG
MC++やろうぜ!
http://www.codeproject.com/managedcpp/
0267デフォルトの名無しさんNGNG
age
0268デフォルトの名無しさんNGNG
wingdi.hに定義されているGetObjectと
System::Resources::ResourceManagerのGetObject
が、重なってしまいます。


ms-help://MS.NETFrameworkSDK.JA/vcmxspec/html/vcmg_AmbiguousReferences.htm
を見て完全限定名を使ってみたりしてるんですがwingdi.hの方で

#ifdef UNICODE
#define GetObject GetObjectW
#else
#define GetObject GetObjectA
#endif // !UNICODE

というようにdefineされてしまってResourceManagerのGetObjectがうまく使えません。
この場合は、どうしたらいいんでしょう?

System::Resources::ResourceManager *rm=
(new System::Resources::ResourceManager(S"testForm",Assembly::GetExecutingAssembly()));
this->set_Icon(dynamic_cast<System::Drawing::Icon *>(rm->GetObject(S"MainIcon")));

0269デフォルトの名無しさんNGNG
>>268
ms-help://MS.VSCC/MS.MSDNVS.1041/vcmxspec/html/vcmg_MacrosandthePreprocessor.htm
0270デフォルトの名無しさんNGNG
あげ
0271デフォルトの名無しさんNGNG
manageC++でダイアログボックスとか使うときは自分でコード書かないといけないのですか?
リソースからボタン貼り付けてボタンダブルクリックするとMFCクラスウィザードとか出てきますが
MFCでしかウィザードは使用できないのですか?
manageC++ではひたすらコード書き込みですか
0272デフォルトの名無しさんNGNG
マネドC++使っている人いますか?
0273デフォルトの名無しさんNGNG
>>272
お前のすぐ上
0274login:PenguinNGNG
普通に使ってますがなにか?

っていいたいところなんだけど、
C#の方が便利だし綺麗だ。
これが現実。
0275_NGNG
ちょっとややこしいよね。そこまでC++に愛着ないし・・・
0276デフォルトの名無しさんNGNG
さらしあげ
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=1638&forum=7
0277_NGNG
なんかDOS→NTの時の3.1, 95みたいな香りがする。。。
0278デフォルトの名無しさんNGNG
>>276
何だかなあ...
0279あぼーんNGNG
あぼーん
0280デフォルトの名無しさんNGNG
age
0281デフォルトの名無しさんNGNG
盛り上がらんね
0282デフォルトの名無しさんNGNG
managed C++ってなんですか?って聞いていい?
■ このスレッドは過去ログ倉庫に格納されています