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

managed C++ やろうぜ!!

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
C#関連のスレは山ほどあるが
managedC++のスレが無いじゃないか。
折角.NETに生き残ったC++、みんなで語ろうぜ。
0404デフォルトの名無しさんNGNG
>>403
いや、「まずC#が先にあって〜」みたいな切り口だった。
0405山崎渉NGNG
     ∧_∧
ピュ.ー (  ^^ ) <これからも僕を応援して下さいね(^^)。
  =〔~∪ ̄ ̄〕
  = ◎――◎                      山崎渉
0406デフォルトの名無しさんNGNG
沈みすぎage

>>404
まず.NETがあって、じゃないかなあ
0407デフォルトの名無しさんNGNG
小さな DLL だったら、
C# でラッパクラス作るよりも、
Managed C++ で書き直しちゃう方が早かった。
てか C# の DllImport うんちゃらがよう分からんですタイ。

Managed C++、思ったより使えそうな感触。
0408デフォルトの名無しさんNGNG
>>407
そのための MC++ です
日本語の参考書籍・・・無いよなあ・・・
0409デフォルトの名無しさんNGNG
無いっすねえ..

6800円かそこらの分厚い本で
VC++.NET 解説みたいなのんが有ったんで
チラっと眺めてみたんですが、
Manged C++ に関する記述は 20 ページかそこらだけ。
この厚さで... と涙せずにはいられませんでした。

つーか .NET と無関係な VC++ な記述が殆どを占めてて泣けた。
チラっと見ただけなんで間違ってるかも知れないけど。
0410洗濯猫NGNG
初心者ですが、
MFCで作ったコードをマネージドに変換して
コンパイルして、
CRLで動くようにできますか?

またドキュメントビューアーキテクチャを
マネージドシープラで実現することは可能ですか?
0411デフォルトの名無しさんNGNG
★クリックで救えるオマ○コがあるらしい★
http://yahooo.s2.x-beat.com/linkvp/linkvp.html
0412デフォルトの名無しさんNGNG
>>410
間にラッパークラスを挟めば可能
0413デフォルトの名無しさんNGNG
MFC 使ったやつとかよりも
API じか叩きしたようなのほど効果有るっぽい。

ところで参照渡しすれば C# で ref する扱いになるみたいだけど
out する扱いは無理ぽ?
ref だけで用事足りるからどうでも良いっちゃ良いのだけど
なんか無駄に気になったので。
0414デフォルトの名無しさんNGNG
void WndProc(Message *m)
{
  if (m->Msg == WM_NOTIFY)
  {
    LPNMHDR nmhdr = (LPNMHDR)m->LParam;
  }
}

Managed C++でこういう感じにキャストしたい場合は、どういう方法でやればいいんでしょうか?
dynamic_castなどでもだめでした。。
0415414NGNG
(LPNMHDR)m->LParam.ToPointer();
で出来ました。。
0416デフォルトの名無しさんNGNG
ほう。なるほど。
0417デフォルトの名無しさんNGNG
.NET C++ でWindowsフォームアプリケーションでウィンドウメッセージを捕まえるにはどうすればいいでしょう?
解像度変更を検出したいんだけど・・・。
0418417NGNG
[System::Security::Permissions::PermissionSet(System::Security::Permissions::SecurityAction::Demand, Name="FullTrust")]
void WndProc(Message* m) {
// ...
}
ヘルプにはFormでWndProcをオーバーライドすると書いてあるんですが、
オーバーライドすると' マネージ型で、仮想メソッドへのアクセシビリティを少なくすることはできません。」
とエラー吐かれます。
そもそも1行目の [System::Security... は何を意味するかと子一時間...
0419デフォルトの名無しさんNGNG
何で参照渡しをポインタにしているのか小一時間...
0420417NGNG
protected:
 void WndProc(Message* m) {
  // ...
 }
これだけでいけますた。
さっきのエラーはprotectedで宣言された仮想関数をprivateには出来ねーぞって事でした。
0421デフォルトの名無しさんNGNG
保守
0422デフォルトの名無しさんNGNG
>>388
ほんとだ使えるようになってる。

MC++で
インデクサとforeachは使えないのでしょうか?
(演算子がC++の時のようにオーバーロードできないような...)
0423デフォルトの名無しさんNGNG
サンプル作ってみた

#include "stdafx.h"
#using <mscorlib.dll>
using namespace System;
using namespace System::Collections;

#define mprint(x) System::Console::WriteLine( x );

namespace DesignPattern
{
__gc public class Book
{
private:
System::String *name;
public:
Book(){this->name = System::String::Empty;}
Book(System::String *n){this->name = n;}
__property System::String* get_Name(){return name;}
__property void set_Name(System::String *n){this->name = n;}
};
0424422(続き)NGNG
__gc public class BookShelf :public System::Collections::ArrayList,
public System::Collections::IEnumerator
{
private:
int mIndex;
public:
BookShelf(int maxsize) :mIndex(-1){}
__property int get_Length(){return __super::Count;}
void append(Book *b){this->Add(b);}
//インデクサが使えないので
Book* at(int index){return static_cast<Book*>( this->get_Item(index) );}
System::Collections::IEnumerator* GetEnumerator(){return this;}
__property System::Object* get_Current(){return at(mIndex);}
bool MoveNext(){
if(mIndex <(this->Length-1)){mIndex++;return true;}
else{return false;}
}
void Reset(){mIndex=-1;}
};
}

using namespace DesignPattern;
0425422(続き)NGNG
int _tmain(){
BookShelf *bookshelf = new BookShelf(3);
bookshelf->append(new Book(S"Book1"));bookshelf->append(new Book(S"Book2"));
bookshelf->append(new Book(S"Book3"));bookshelf->append(new Book(S"Book4"));
/*これをやりたいんだが...
foreach(Book book in bookshelf)
Console.WriteLine(book.Name);*/
//ちょっとだるいね
for(int i=0;i<bookshelf->Length;i++){System::Console::WriteLine( bookshelf->at(i)->Name );}
//だるいよだるすぎるよ
{IEnumerator *i = bookshelf->GetEnumerator();
i->Reset();
while(i->MoveNext()){
Book *book = static_cast<Book*>( i->Current );
mprint(book->Name);
};}
//ということで foreachをマクロでやってみる
#define mforeach(type____,identifier____,expression____) \
{ IEnumerator *i____ = expression____->GetEnumerator(); \
i____->Reset(); \
while(i____->MoveNext()){ \
type____ *identifier____= static_cast<type____*>( i____->Current );
#define mforeach_end \
}; \
}
//イイ
mforeach(Book,book,bookshelf)
mprint(book->Name);
mforeach_end
return 0;}
0426デフォルトの名無しさんNGNG
Quake II .NET
http://www.vertigosoftware.com/Quake2.htm

カコ(・∀・)イイ!
0427デフォルトの名無しさんNGNG
managed Age++
0428デフォルトの名無しさんNGNG
マネージドなクラスをSTLのコンテナに入れることは、できないみたいだな。
0429デフォルトの名無しさんNGNG
COBOLだけはガチ!
0430428NGNG
gcrootを使ってできた。
0431デフォルトの名無しさんNGNG
>>430
へー。
こんな感じでやってみたけどOKだった。
std::vector<gcroot<String*> > v;
for(System::Int32 i=0;i<100;i++){
v.push_back(String::Concat( S"test",i.ToString() ) );
}
Console::WriteLine( v[23]->ToString() );
0432デフォルトの名無しさんNGNG
>>431
http://pc2.2ch.net/test/read.cgi/tech/1058618416/
0433デフォルトの名無しさんNGNG
>へー。
>こんな感じでやってみたけどOKだった。
読んだ瞬間ダメだったのかと思って焦った。

ところでこのToString()はいらないよ。
>Console::WriteLine( v[23]->ToString() );
0434デフォルトの名無しさんNGNG
>425
static_castでいいのかな?
dynamic_castで型のチェックした方がいいと思うんだが。
0435425NGNG
>>434
ほんとですね。
動的にチェックするように変更しました。
(キャスト失敗時に System::InvalidCastException がスローされます)

#define mforeach(type____,identifier____,expression____) \
{ System::Collections::IEnumerator *i____ = expression____->GetEnumerator(); \
i____->Reset(); \
while(i____->MoveNext()){ \
type____ *identifier____= __try_cast<type____*>( i____->Current );
0436デフォルトの名無しさんNGNG
http://homepage2.nifty.com/MXC03711/mc/managedcpp.htm
0437山崎 渉NGNG
(^^)
0438デフォルトの名無しさんNGNG
MSDNのXmlSerializerにあるサンプルをMC++で試しているのですが、
__gc struct Address{
[XmlAttribute] String *Name;
};
の[XmlAttribute]のアトリビュートだけがなぜか見つからないと出ます。
解決策はないのでしょうか?

(他の属性はSystem.Xml.dllを参照の追加してOKでした)↓
[XmlElementAttribute][XmlArrayAttribute][XmlRootAttribute]

0439デフォルトの名無しさんNGNG
そりゃXmlAttributeAttributeじゃな。たしかに紛らわしいけど。
最初のAttributeはXMLの属性のことで、次のAttributeは.NETの属性のことじゃ。
0440デフォルトの名無しさんNGNG
>>439
[XmlAttributeAttribute]でできました。ありがとうございます。
System.Attributeの派生クラスでないと属性には使えないから
System.Xml.XmlAttributeはSystem.Xml.XmlNodeの派生クラスでXMLの属性なんですね。

C#,MC++ともにTest.HogeAttribute が属性の[]の中では
[Test.Hoge]か[Test.HogeAttribute]と書けるみたいです。

だから、C#で[XmlAttribute]と書かれたものはXmlAttributeかXmlAttributeAttributeのはず。
したがって、属性クラスのSystem::Xml::Serialization::XmlAttributeAttributeを使えばよい。

ただ、MC++で[XmlAttribute]とするとエラーが起きる模様。(->XmlAttributeAttributeとは自動解釈しない?(安全策?))
また、C#では[XmlAttribute]でも可能。でも、カーソルを持っていくと、
ツールチップにSystem.Xml.XmlAttributeと表示されるみたいだが???...。
(->C#コンパイラはXmlAttributeAttributeを選んでるのかな?)

usingする前提だと名前の衝突で紛らわしいことになるからフルネームで
[System::Xml::Serialization::XmlAttributeAttribute]
としておいたほうがいいのかな。
ただ、System::Xml::Serialization::XmlAttributeAttributeAttributeができたとき,
C#とMC+でどうなるのかは試してないです。
0441山崎 渉NGNG
    (⌒V⌒)
   │ ^ ^ │<これからも僕を応援して下さいね(^^)。
  ⊂|    |つ
   (_)(_)                      山崎パン
0442デフォルトの名無しさんNGNG
checkedステートメント
は使えないのでしょうか?
0443デフォルトの名無しさんNGNG
>442
使えないようですね。
0444デフォルトの名無しさんNGNG
age
0445デフォルトの名無しさんNGNG
昔ドキュメントビューアーキテクチャでC++あきらめました。
Del厨です。
最近C#がだいたい使えて来たので、
MC++→MFC→非MFCと言う順番に学習したいと思ってます。
C♯→MC++移行で参考になるようなサイトないでしょうか。
たとえば、初心者はC♯よりもVBよりもMC++なら将来ネイティブアプリ作れるとか、
たとえばC++なのに.NETなら簡単にブラウザを作れるみたいな。
無理?
0446デフォルトの名無しさんNGNG
→非MFCは別にいらんとおもうけどなあ
0447デフォルトの名無しさんNGNG
>MC++なら将来ネイティブアプリ作れるとか
カエレ!
0448デフォルトの名無しさんNGNG
C#プロジェクト(アプリ)にMC++プロジェクト(ライブラリ)を挿入して、
参照の追加をしているのですが、
test.cpp で普通にインクルードしたいのですが、例えば
#include<string>とすると

test error LNK2001: 外部シンボル ""void * __cdecl memmove(void *,void const *,unsigned int)" (?memmove@@$$J0YAPAXPAXPBXI@Z)" は未解決です。
test error LNK2001: 外部シンボル ""void __cdecl __CxxCallUnwindDtor(void (__thiscall*)(void *),void *)" (?__CxxCallUnwindDtor@@$$J0YAXP6EXPAX@Z0@Z)" は未解決です。
test error LNK2001: 外部シンボル ""void __cdecl operator delete(void *)" (??3@$$FYAXPAX@Z)" は未解決です。
.... (計:30件)
というエラーが出てしまうのですが、解決策はあるのでしょうか?
(VC2003,XP)

NG: vector,list,deque,string,locale,boost/shared_ptr.hpp ....
OK: cstdlib,cstdio,boost/timer.hpp,typeinfo,boost/scoped_ptr.hpp ....
0449デフォルトの名無しさんNGNG
おい!
managedC++はなんでフォーム継承できないんだ?????
0450デフォルトの名無しさんNGNG
VBやC#からでも簡単にCOMが呼べることを知って、MC++を使わずにATLで
コンポーネントを相変わらず書いている私は逝ってヨシですか?

移行するタイミングが難しいんだあ。
0451デフォルトの名無しさんNGNG
Managed C++は次のバージョンで文法が全く別物になります。
0452デフォルトの名無しさんNGNG
仕様書のドラフト版出たよ。
ttp://download.microsoft.com/download/9/9/c/99c65bcd-ac66-482e-8dc1-0e14cd1670cd/C++%20CLI%20Candidate%20Base%20Draft.pdf
0453デフォルトの名無しさんNGNG
MFCとどっちが仕事になりますか
0454デフォルトの名無しさんNGNG
>>450
結構居るみたいですよ、そんな人。逆もできるしね。
.NETの相互運用能力ってちょっといい感じ。お気に入りです。
0455デフォルトの名無しさんNGNG
人気ないなぁ・・・

>>452
C++/CLIだって。

N* hn = new N; // allocate on native heap 40
N& rn = *hn; // bind ordinary reference to native object
R^ hr = gcnew R; // allocate on CLI heap
R% rr = *hr; // bind tracking reference to gc-lvalue

^とか%使い回すあたり、なんか好きだ
CLIヒープクラスも指定子がrefになって、見た目に分かりやすいな
いいかげん、__hogeな書式のキーワードはうんざりだからな
リリースはいつごろだろう
0456デフォルトの名無しさんNGNG
てか、CLIヒープクラスって言い方は違うのかな
クラスの種類にかかわらず、newもgcnewもできる?
もう少し読もう
0457デフォルトの名無しさんNGNG
単にref classと言えばいいのか?
C++のリファレンスとの関連性はあるんかな
もう少し読もう
0458デフォルトの名無しさんNGNG
ちかれた・・・。
やっぱ単に__gc → refか。
for eachはよいね。
0459デフォルトの名無しさんNGNG
>CLIヒープクラスも指定子がrefになって、見た目に分かりやすいな

この時点で、

__gcクラスも指定子がrefになって、見た目に分かりやすいな

と言えばよかっただけか。
てか、誰もいないじゃん。一人芝居ショボン
0460デフォルトの名無しさんNGNG
以前、「managed C++は整数もかならず整数オブジェクトになる」と言われますた。

そのときはアホな設計だなぁ、と思ったのですが、
手元にあるショボイ入門書を見ると「単純型」というのがあるので、
これが Javaでいうプリミティブ型に相当するのではないかと思うのですが、
実際のところどうなんでしょうか。教えて Teach Me
0461デフォルトの名無しさんNGNG
>>460
そうだよ
value classのこと
Javaより柔軟だから
0462461NGNG
と、思ったが何か違うな

そもそも、「managed C++は整数もかならず整数オブジェクトになる」んだっけ?
教えて Teach Me
0463461NGNG
多少こんがらがったが、

Managed C++ ≒ Java
__value class≒primitive type
__gc class≒class
__box(__value class)≒class Wrapper { primitive type member; }

こんな感じ

0464デフォルトの名無しさんNGNG
>>460
javaで言うところの、primitive型とclass型の間を、比較的簡単に
行き来できるのが.NET系の言語の特徴。

MC++でもそれを利用できるが、intと書いただけでIntegerオブジェクトが
生成されるわけではない。

value型とclass型の違いはCLRでも重要な事項なので、
MC++に触れる前にしっかり理解しておいたほうがいいと思う
0465デフォルトの名無しさんNGNG
アンマネージドコンテキストに限定して書いてるのかもしれないけど、
MC++でも、intはSystem::Int32 value type(simple type) だと思うよ

0466デフォルトの名無しさんNGNG
>>465
コンテキストに依存するのでは?
0467デフォルトの名無しさんNGNG
寂れてる様に見えるが見てる人はゼロでないのだな
0468デフォルトの名無しさんNGNG
>>466
そう書いたつもりが、そうなってなかった
宇都氏
0469デフォルトの名無しさんNGNG
>>467
そろそろ飼いならした人が増えてきてもいいんじゃないかなー
日本語の解説書が欲しいところ
0470デフォルトの名無しさんNGNG
>>469

出版社を探して自分で翻訳;-p
0471デフォルトの名無しさんNGNG
一冊全部MC++って、話題もつの?
0472デフォルトの名無しさんNGNG
http://www.amazon.co.jp/exec/obidos/ASIN/0735617244/
http://www.amazon.co.jp/exec/obidos/ASIN/1893115283/
このへんかな。前者は持ってる。
0473デフォルトの名無しさんNGNG
これはC++じゃないと思った。
0474デフォルトの名無しさんNGNG
さすがに濃い内容ですなあ。
ttp://weblogs.asp.net/slippman/
0475デフォルトの名無しさんNGNG
>448
かな〜り遅いレスだが、これは msvcrt.lib, msvcrtd.lib をリンクすればいい
でも、なるべく #pragma unmanaged のエリアで使おう
0476デフォルトの名無しさんNGNG
ところで、漏れの質問なんだが boost::spirit をアセンブリにして利用したくて
managed C++ で boost::spirit のC構文のサンプルをコンパイルしたんだが、
C1129 つーエラーが出て歯がたたねぇ

普通のC++としてはサンプルは無事動くのに、managed C++ じゃテンプレートの
展開が違うのか?
0477デフォルトの名無しさんNGNG
>476
自己解決。boostをインクルードしているとこまでまとめて unmanaged 指定してやったら
コンパイルは通過。ただし、リンクエラーLNK1254でだめぽ
r'⌒X⌒X⌒X⌒X⌒X⌒X⌒X⌒X⌒X⌒X⌒X⌒X⌒X⌒X⌒ヽ ⊂゙⌒゙、∩
ヽ__乂__乂__乂__乂__乂__乂__乂__乂__乂__乂__乂__乂__乂__乂__ノ  ⊂(。Д。)
0478デフォルトの名無しさんNGNG
.NETも従来のC++も使いたいんだけど
コードの中で混在させる事は出来ますか?
.NETは資料が少ない(C++の場合)ので、自分にはメインでは使えないのですが
簡単にスレッド起こせたり、フォームの半透明とかが簡単だったりするんで・・・
0479デフォルトの名無しさんNGNG
混在可能。

> 自分にはメインでは使えないのですが
> 簡単にスレッド起こせたり、フォームの半透明とかが簡単

そういう部分をメインというと思うんだがどうか。
0480デフォルトの名無しさんNGNG
質問です。

C#で
Byte[] sendBytes = Encoding.ASCII.GetBytes("01"+textBox1.Text+" "+textBox2.Text+"\0");
こんな感じで書いてたコードを
managedC++で書き直したいのですが
どうすれば良いのでしょうか?
Byte sendBytes[] = Encoding::ASCII->GetBytes("01" + textBox1->Text + " " + textBox2->Text + "\0");
これだと、ポインタにポインタが足せないと言われてしまいます。
0481デフォルトの名無しさんNGNG
>>480
地道に String::Concat かな?
0482デフォルトの名無しさんNGNG
文字列4つまでは Concat で一度に連結できるようだ。
0483デフォルトの名無しさんNGNG
どうもです。
とりあえず
sprintf(buf2,"01%d %d\0",textBox1->Text,textBox2->Text);
としました。。。(Cの知識しか殆ど無かったりします。
0484デフォルトの名無しさんNGNG
%sの間違いです。
0485483NGNG
またまたすみません。。。
>>480で書いたC#のコードと
>>483でやったコードの結果が違うようです。
一応、この文字列をUDPでサーバーへ転送するのですが
サーバー側でフフフという文字が大量に発生してしまいます。(\0が無い為?
何故このような事がおきるのでしょうか?
0486デフォルトの名無しさんNGNG
sprintf(buf2,"01%d\n %d\n\0",textBox1->Text,textBox2->Text);
こんな感じで\nを付けてみ
0487483NGNG
>>486
どうもありがとうございます。
無事出来ました。
0488デフォルトの名無しさんNGNG
namespace 会社名.プロジェクト名
{
  public class ホゲホゲ
  {
  }
}

C#で上のように書いたコードを Managed C++ で書き直した場合どうする?

namespace 会社名.プロジェクト名
{
  __gc class ホゲホゲ
  {
  };
}

って書けない?
namespace を一発で書くような方法をきぼんぬ。
0489デフォルトの名無しさんNGNG
IPEndPoint *RemoteIpEndPoint = new IPEndPoint(IPAddress::Any, 0);
Byte receiveBytes[] = udpClient->Receive(&RemoteIpEndPoint);
String *returnData = Encoding::ASCII->GetString(receiveBytes);
MessageBox(NULL, returnData, "", MB_OK);


こんな感じで受信結果をMessageBoxで表示したいのですが
型が違うため出来ません。
どのようにすればいいのでしょうか?
0490デフォルトの名無しさんNGNG
・どの行でエラーになってるのか
・エラーの詳細
を書け
0491489NGNG
MessageBox(NULL, returnData, "", MB_OK);
ここで
error C2664: 'MessageBoxA' : 2 番目の引数を 'System::String __gc *' から 'LPCSTR' に変換できません
        マネージ型をアンマネージ型に変換できません。

です
0492489NGNG
とりあえず
sprintf(RevBuf,"%s",returnData);
こんな感じで、無理やり変換しましたけど。。。
なんだかなぁ・・・
0493デフォルトの名無しさんNGNG
>>489
String型をC文字列に変換するメソッドがあると思うけど。
0494デフォルトの名無しさんNGNG
う〜む・・・
なんでMC++はこんなに普及しないんだ?
時期OSの仕様がああなった以上、.NETは避けて通れない道
現に、C#の書籍や情報はあちこちに溢れてる

でも、C++で.NETってのがこんなに普及してないのが不思議でしょうがない。
なんでだろう・・・・・
俺も勉強したくても書籍はないわWebにも殆ど資料ないわ、MSDNにはC#とVB.NETのみだわで大変

もしかしてC#の方が楽って事?
Win32APIやMFCで作った過去の遺産を使いたいって人も居ると思うんだが・・・
0495デフォルトの名無しさんNGNG
VisualStudio.NET2002では、ManagedC++でのフォーム作成がGUIでできなかったって
聞いたことあるけどホントですか?
0496デフォルトの名無しさんNGNG
VisualStudio買わないとVC++の最適化コンパイラが手に入らないのが(´・ω・`)
0497デフォルトの名無しさんNGNG
>>494
MC++とはまた別のものを作ってるという話もあるよ
0498デフォルトの名無しさんNGNG
C++/CLIでそ
MC++はつなぎなんじゃないの
0499デフォルトの名無しさんNGNG
C#の方が256倍マシ
.NETでマネージドC++なんか使ってるやつの気がしれない
0500デフォルトの名無しさんNGNG
情報量の少なさに耐えかねてMC++見限ってC#に行きました。。。
これもMSの計略か・・・・
0501デフォルトの名無しさんNGNG
C++はネイティブのオブジェクト指向言語というだけの価値しかないわけだし。
ネイティブじゃないなら存在意義が無いし
0502デフォルトの名無しさんNGNG
んー、でもXMLシリアル化とか結構魅力なんだよねー。
0503デフォルトの名無しさんNGNG
MC++はラッパとしての価値がメインなんじゃね?
COM化するのが正統なんだろうけど、それもメンドいことあるし。
■ このスレッドは過去ログ倉庫に格納されています