managed C++ やろうぜ!!
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNGmanagedC++のスレが無いじゃないか。
折角.NETに生き残ったC++、みんなで語ろうぜ。
0797デフォルトの名無しさん
2005/06/05(日) 21:09:41まったくこれだからカスどもは
0798デフォルトの名無しさん
2005/06/05(日) 21:17:400799デフォルトの名無しさん
2005/06/12(日) 14:56:07すべて *.h に書くのが普通なのでしょうか?
(そもそも定義部と実装コードは分けられないようですが)
VS2005を使うと*.hにコードがあり、#includeだけの*.cppが生成されます。
全部*.cppに書いても問題ないような気がしますがどうなのでしょうか。
0800デフォルトの名無しさん
2005/06/12(日) 16:25:02事情がない限りは.hに書いたほうがいいんじゃね?
0801デフォルトの名無しさん
2005/06/12(日) 17:22:050802デフォルトの名無しさん
2005/06/13(月) 00:51:540803デフォルトの名無しさん
2005/06/13(月) 08:19:040804799
2005/06/13(月) 15:36:41の部分は誤りでした。実装コード側に定義部と同じnamespaceをつけるのを忘れて
エラーが出ていました。C++クラスのテンプレートから作成した場合 802さんの
おっしゃるとおりインラインかどうかを選択できました。
普通のC++のクラスでインラインを多用するとロードモジュールのサイズが
肥大化するので心配していたのですが、Managedクラスの場合はそういう問題は
起きないようで、インラインか否かは表記上の問題で生成されるロードモジュール
に違いはでないようです。
0805デフォルトの名無しさん
2005/06/19(日) 00:42:350806デフォルトの名無しさん
2005/06/19(日) 01:03:09しーぷらぷらしーえるあい?
0807デフォルトの名無しさん
2005/06/19(日) 15:01:230808デフォルトの名無しさん
2005/06/19(日) 15:33:530809デフォルトの名無しさん
2005/06/21(火) 21:56:27C++: .NET Framework プログラミング最良の言語
http://www.microsoft.com/japan/msdn/vs05/visualc/VS05Cplus.asp
STL.NET 入門
http://www.microsoft.com/japan/msdn/vs05/visualc/stl-netprimer.asp
0810デフォルトの名無しさん
2005/06/22(水) 08:59:31変換ガイド: Managed Extensions for C++ から C++/CLI へのプログラムの移行
Stanley B. Lippman
http://www.microsoft.com/japan/msdn/vs05/visualc/TransGuide.asp
0811デフォルトの名無しさん
2005/06/22(水) 16:32:33何か後半中部の訳が変じゃない?(前半部と最後は良かったんだが...
>難解で洗練されていない構文を使用すると、開発プロセスにおける危険性が増大します。これは、フロントガラスの汚れや煙が自動車事故の危険性を高めるのと同じです。改訂されたデザインでは、磨き上げられた新品のフロントガラス並みに構文の透明性が向上しています。
ワロタ
>構文糖
>??
>const char* インスタンスに解決されていた解決が、あいまいとしてフラグされるようになりました。
>コンパイル時間ダウンキャスト
0812デフォルトの名無しさん
2005/06/24(金) 23:51:57シンタックスシュガー
0813デフォルトの名無しさん
2005/06/25(土) 02:22:060814デフォルトの名無しさん
2005/06/25(土) 02:27:14うち何件か企画はあったんだけど検討の結果全部C#になりました。
0815デフォルトの名無しさん
2005/06/25(土) 02:31:00メインとしてはとても使えないけど、旧来のルーチンをラップするにはベターな選択だ
0816デフォルトの名無しさん
2005/06/25(土) 15:11:050817デフォルトの名無しさん
2005/06/25(土) 19:54:450818デフォルトの名無しさん
2005/06/27(月) 13:05:030819デフォルトの名無しさん
2005/06/27(月) 17:48:00標準C++と変わらない
今までの STL はネイティブに対しては今まで通り使えるし、ref 型とかは STL.NETが
用意される
0820デフォルトの名無しさん
2005/06/28(火) 23:23:47Boostは使えるん?
0821デフォルトの名無しさん
2005/06/28(火) 23:33:40spilit でパーサ使ってるが?
アセンブリという概念が組み込まれてるので、テンプレートはちょっと実用範囲が低下するが
アセンブリ内なら普通に使える
ヘッダ取り込みなんて無様な真似はアセンブリ内で閉じておけと
0822デフォルトの名無しさん
2005/06/28(火) 23:34:250823デフォルトの名無しさん
2005/06/29(水) 12:29:16LPARAM に this ポインタを渡したいのですが、方法がわかりません。
こういうことはできない、またはすべきでなかったりするのでしょうか?
0824デフォルトの名無しさん
2005/06/30(木) 00:03:34EnumWindows(&func, current);
で駄目なん?
0825デフォルトの名無しさん
2005/06/30(木) 01:09:37ref class A {
void Enum() {
pin_ptr<A^> pinnedThis = &((A^)this);
EnumWindows(func, (LPARAM)pinnedThis);
}
};
これなら通りました、ただちゃんと動いているのかは、まだ見てないのですけど・・・
しかし、
ref class A {
static BOOL Enum(HWND h, LPARAM lp) {
A* a = reinterpret_cast<A*>(lp); // <- 結局これができないので、
return 1;
}
};
どうしたものか、というところです
this を渡しているのは、結局 HWND を自分に渡したいからで、
その辺を LPARAM に頼らない形で作ったほうがいいのかな、とも思っています
と言っても static メンバを使うとかしか思いつかないのですけど、、、
0826デフォルトの名無しさん
2005/06/30(木) 01:31:52A* a = reinterpret_cast<A*>(lp); を
A^ a = interior_ptr<A>(lp);
では?
まぁ、ネイティブのワーククラス作った方が簡単だと思うんだけど
0827デフォルトの名無しさん
2005/06/30(木) 01:32:57interior_ptr<A> a = lp;
だね
0828デフォルトの名無しさん
2005/06/30(木) 15:23:58interior_ptr じゃないですけど、
GCHandle gch = GCHandle::Alloc(this);
::EnumWindows(enumProc,
reinterpret_cast<LPARAM>(GCHandle::ToIntPtr(gch).ToPointer()));
gch.Free();
コールバック先で
A^ This = safe_cast<A^>(GCHandle::FromIntPtr(IntPtr(lp)).Target);
This->hoge(hWnd);
GCHandle なんてはじめて知りました。
0829デフォルトの名無しさん
2005/07/11(月) 10:17:57ref class 内で、windows.h などにある unmanaged の構造体を
メンバにしようとすると、コンパイルエラーになってしまいますが
こういうときは ref なしの class を作ってやるしかないのでしょうか
0830デフォルトの名無しさん
2005/07/11(月) 16:13:57こんな感じのユーザコントロール作って、C#からFireEvent()呼ぶと正常。
COMでイベントが発生するとCEvents::OnEvent()が呼ばれる。ここまではOK
で、そこからFireEvent()呼ぶとCOMEvent::OnEvent()呼び出しで
System.ArgumentNullException : 値を Null にすることはできません。
VSでみるとCOMEvent::OnEvent()が<未定義の値>になってる
public __gc class COMEvent:UserControl{
public:
__delegate void EventDelegate();
__event EventDelegate* OnEvent;
void FireEvent(){
OnEvent();
}
};
class CEvents:
public IDispatchImpl<IEvents,&IID_Events,&LIBID>,
public CComObjectRoot
{
BEGIN_COM_MAP(CEvents)
COM_INTERFACE_ENTRY(IEvents)
END_COM_MAP()
public:
gcroot<COMEvent*> m_control;
void STDMETHODCALLTYPE OnEvent(){
m_control->FireEvent();
}
};
0831デフォルトの名無しさん
2005/07/11(月) 18:34:44ポインタを使えばいけるんじゃないかな?
C++/CLI使ってないから見当はずれかもしれないけど
0832デフォルトの名無しさん
2005/07/11(月) 18:51:330833デフォルトの名無しさん
2005/07/11(月) 19:10:44> だったら答えるなよ
> だったら答えるなよ
> だったら答えるなよ
0834デフォルトの名無しさん
2005/07/11(月) 19:30:47その通りです。そういったクラスは混合型と呼ばれ、将来拡張予定の機能です。
それまでは、別に管理クラスを作るか >831 の言う通り、IntPtrに new して
持たせてください
0835デフォルトの名無しさん
2005/07/11(月) 19:44:01gcroot<COMEvent*> m_control が null 値なんじゃね?
いつ作ってんの?
0837デフォルトの名無しさん
2005/07/11(月) 20:35:18>835 は間違えた。忘れてくり。
EventDelegate * の OnEvent はどこで生成してるの?
0838デフォルトの名無しさん
2005/07/11(月) 20:37:37追加ですが、.Net Framework 2.0 では IntPtr に加えてリファレンスカウンタなどの Ptr 型が
増えているので、それらを利用するのも手だと思われます
System::Marshal 周りを探してみてください
0839850
2005/07/12(火) 01:53:55このUserControlを使うC#コードで生成してます
inst.OnEvent+=new EventDelegate(hoge);
inst.FireEvent();
と書いてみるとここではちゃんと動くんですよね
その後に発生するCOMイベントから
CEvents::OnEvent()経由でFireEvent()がよばれて、そこだとうまくいかないんです
今ソースないので試せませんが純粋仮想関数でも似た結果だったような
0840デフォルトの名無しさん
2005/07/12(火) 10:58:35となると、やっぱり、m_control に値が入っていないような気がするんだけど、これって
どの段階で生成されるオブジェクトなの?
gcroot は非マネージド・オブジェクトがマネージド・オブジェクトを保持するエリアだよね
だから、どこかで COMEvent のインスタンスが渡されていないといけないんだけど
0841850
2005/07/12(火) 13:21:34たしかにm_controlに値を入れるメソッドを作るのは後回しにしたままでした
m_controlに値が入ってなければm_control->FireEvent();
の時点で失敗するだろうという思い込みが原因でした
ありがとうございました
0842デフォルトの名無しさん
2005/08/18(木) 21:41:58vector<string^>^ a(gcnew vector<string^>^);
微妙な顔文字に見えてきて、微妙。
0843デフォルトの名無しさん
2005/08/19(金) 00:23:03そういわれたら顔文字にしか見えなくなってきたじゃないか
0844デフォルトの名無しさん
2005/08/20(土) 12:50:330845デフォルトの名無しさん
2005/08/20(土) 23:57:27入れるとややこしいのが出てくるとついていけない様な感じがして
これから先のC++の印象が…。C#に逃げてしまいそう。
なんかいいH.P.ありませんか?
0846デフォルトの名無しさん
2005/08/21(日) 00:37:53ジェネリクスと無名関数オブジェクトがついた以上
C++をあえて使う意味は無くなったよ。
0847デフォルトの名無しさん
2005/08/22(月) 13:06:05C++よりもマイナーC丼にふさわしい形容。
0848デフォルトの名無しさん
2005/08/26(金) 15:32:020849デフォルトの名無しさん
2005/08/26(金) 21:41:440850デフォルトの名無しさん
2005/08/26(金) 21:59:15boost::lambda(・∀・)イイ!!
0851デフォルトの名無しさん
2005/08/26(金) 22:15:310852デフォルトの名無しさん
2005/08/26(金) 22:27:55そんな色物いらん
ただのシンタックス・シュガーで充分だから、匿名デリゲートがある方がいい
単純な比較やソートに使うだけだから
0853デフォルトの名無しさん
2005/08/26(金) 23:17:04全然追いつけないぉ
0854デフォルトの名無しさん
2005/10/06(木) 20:26:060855デフォルトの名無しさん
2005/10/08(土) 15:13:430856デフォルトの名無しさん
2005/10/08(土) 15:22:31>>854
実際どうか、試してみないと何とも言えんから、自分でやれ
0857デフォルトの名無しさん
2005/10/22(土) 11:58:51今度C++(学校にある環境はvc++ ver6)を勉強することになりました。
vs.net2003で選べるc++とvc++ ver6のc++って全然別物なのでしょうか?
それとも家でvs.netでc++やっても勉強になるんでしょうか?
0858デフォルトの名無しさん
2005/10/22(土) 12:52:22managed じゃなければいっしょ。
vs.net の c++ でも、managed を選ばなければ、vc6といっしょだよ。
0859デフォルトの名無しさん
2005/10/22(土) 13:11:00やったことないけど、プロジェクトのコンソールアプリでファイル名.cppにしてもWIN32API使えるんですか?
自分では、プロジェクトでコンソールアプリで.cならC言語、.cppならC++、
WIN32アプリやMFCならVCだという頭があったけど。
0860デフォルトの名無しさん
2005/10/22(土) 14:40:06全然使える。
超使ってる。
0861デフォルトの名無しさん
2005/10/22(土) 21:30:500862デフォルトの名無しさん
2005/11/17(木) 04:14:43managedなdllを作る場合、コンパイルオプションはどのようにつければよいでしょうか?
以下のコードを"cl /clr /LD ***.cpp"というコマンドでコンパイルしても、managedなdllが作成できませんでした。
どなたかご教授お願いします。
class umgd {
public :
umgd() { }
~umgd() { }
show() { printf( "test\n" ); }
}
__gc class mgd {
public :
mgd() { p_umgd = new umgd(); }
~mgd() { delete p_umgd; }
show() { p_umgd->show(); }
private :
umgd *p_umgd;
}
0863デフォルトの名無しさん
2005/11/17(木) 09:23:340864デフォルトの名無しさん
2005/11/17(木) 15:10:300865デフォルトの名無しさん
2005/11/17(木) 16:23:34>__gc class mgd {
先頭にpublicが抜けてるだけでは。
LNK4243の問題が無ければP/Invokeよりこっちを使いたいよ。
0867デフォルトの名無しさん
2005/11/17(木) 18:33:29C#やってた人が同居していちゃいちゃするの
0868862
2005/11/17(木) 23:43:12無事dll化することができました。
LNK4243の警告は出ましたが、とりあえずは使えるようなので今はそのまま使っています。
下記に参考になる情報が載っているようなので、もうすこし頑張ってみます。
返答、ありがとうございました。
ttp://support.microsoft.com/?id=814472
ttp://blog.windy.ac/managed_c/
0869デフォルトの名無しさん
2005/12/04(日) 21:40:47CHOCOAのCCAPIを使って.NETでBOTを作ろうと思っています
MFCの時は登録されていたタイプライブラリからCOleDispatchDriverの派生クラスを自動生成し、
CreateDispatch("CHOCOA.Application");で対応するオブジェクトを得ることができたのですが…
"参照の追加"で生成したdllにInterop::ChocoaLib::CHOCOAというクラスができて、
CHOCOA* chocoa = new CHOCOA();
とすると、このクラスはインタフェイスで生成することはできない、とコンパイルエラーが出ます。
で、隠しクラスっぽいCHOCOAClassというのが入っていたので、
CHOCOA* chocoa = new CHOCOAClass();
とすると、実行時に"DA21EA40-0A85-11D2-901F-00000E7C45FA"というCLSIDは見つからない、と言われました。
regeditでHKEY_CLASSES_ROOT\CHOCOA.Application\を見ると
{F3052B65-0A50-11D2-901F-00000E7C45FA}となっているので、
どうもこの辺が合ってない気がするのですが…
それで、このCLSIDでマネージクラスを生成すればどうにかなるんじゃないかと思うのですが、
どのようにしたら生成できるでしょうか?
0870デフォルトの名無しさん
2005/12/04(日) 21:41:370871デフォルトの名無しさん
2005/12/04(日) 22:10:34つーかよ、それCOMとして登録されているDLLとInteropに追加したDLLが別もんなんでね?
参照で追加するとき、レジストリに登録されているCOMを指定してやったら?
0872デフォルトの名無しさん
2005/12/04(日) 22:26:12えっと、その辺がよく分からんのです。。
正直言ってCOMの仕組みにはあまり自信がないので。。。
HKEY_CLASSES_ROOT\CLSID\{F3052B65-0A50-11D2-901F-00000E7C45FA}\ の下に
InprogHandler32 = ole32.dll
LocalServer32 = CHOCOAの絶対パス
ProgID = CHOCOA.Application
というキーがあったので、chocoa.exeを参照すればいいのかと思ったのですが、参照できませんでした。
他にそれっぽいライブラリ系のファイルは見当たらないです。
今はchocoa.tlbっていうタイプライブラリを使っています。MFCの時も一緒です。
ただMFCの時はCreateDispatchで"CHOCOA.Application"を指定できたものの、
.NETのほうではこれに相当する部分がないなぁ、という感じなのです。
0873デフォルトの名無しさん
2005/12/04(日) 22:44:14その時、COMの一覧の中から、CHOCOAを指定してやったらどう?
どうも、そのタイプライブラリと、登録されているGUIDが一致してないようにしか
見えないんだけど
0874デフォルトの名無しさん
2005/12/04(日) 22:58:57私も原因はGUIDの不一致だと思います。
で、そこのCOMの一覧にChocoaLibっていうのがあるんですが、
それを選択すると↑で言ったようになってしまうんです。。
0875デフォルトの名無しさん
2005/12/04(日) 23:08:11あったような気がするけど気のせいかもしれない。
tlbimp hoge.exe /out:hogeexe.dll とかしてinteropアッセンブリを手動で作ってみては?
0876デフォルトの名無しさん
2005/12/04(日) 23:38:38ありがとうございます。ただ、やってみたところエラーでした。
>TlbImp error: The input file 'C:\Program Files (x86)\Local\CHOCOA\chocoa.exe' is
> not a valid type library
今タイプライブラリから生成されたアセンブリを逆アセして
CHOCOAClassのGUIDを書き換えて再アセンブルする
という方法を思いついたのですが、ちょっと怖いな。。
0877デフォルトの名無しさん
2005/12/05(月) 00:02:57何度もご返事くださった方、ありがとうございました。
これはタイプライブラリの生成時がアレだったということなのかなあ。。
0878デフォルトの名無しさん
2005/12/09(金) 17:16:46基本的には機嫌良く動いているのですが、同じクラスライブラリ内のクラスを
継承した派生クラスでデストラクタを記述しようとするとエラーが出ます。
継承関係のないクラスのデストラクタは成功します。
中身を空にしたりvirtual や void を付けたり取ったりしても同じです。
また普通にFormのプロジェクト内で作成したクラスの継承では問題ありません。
error LNK2001: 外部シンボル ""void __cdecl __CxxCallUnwindDtor(void
(__thiscall*)(void *),void *)"
(?__CxxCallUnwindDtor@@・・・・)" は未解決です。
クラスライブラリ内で継承したクラスにデストラクタをつけるにはどうしたらいいでしょうか?
0879878
2005/12/12(月) 23:42:310880デフォルトの名無しさん
2005/12/13(火) 09:03:18簡単なアプリでも起こせるの?
0881878
2005/12/14(水) 17:26:38えっと、肝心なことが漏れてたのですが、__gcクラスのデストラクタでエラーが出ます。
__gcをとるとエラーはなくなります。
↓これでエラー再現しました。(クラスライブラリ(.NET)にて)
// test.h
#pragma once
using namespace System;
namespace test
{
public __gc class Class1
{
public:
~Class1(){;}
};
public __gc class Class2 : public Class1
{
public:
~Class2(){;}
};
}
0882デフォルトの名無しさん
2005/12/14(水) 22:35:49うーん・・・。手元の環境に2003を入れてないので、2005 英語版で試してみたんだけど
/clr:oldSyntax でコンパイル
namespace DestOrth {
public __gc class Class1
{
public:
Class1()
{
}
virtual ~Class1()
{
}
};
public __gc class Class2 : public Class1
{
public:
Class2()
{
}
virtual ~Class2()
{
}
};
}
これちゃんとコンパイルできたよ?
リンク時にトラぶってるのかな
0883デフォルトの名無しさん
2005/12/14(水) 23:28:22http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpguide/html/cpconusingcdestructorsyntax.asp
0884878
2005/12/15(木) 02:27:16>>883
こんなのもあったりで、なにがなんやら・・・
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vcmxspec/html/vcmanagedextensionsspec_4_2.asp
それから、新展開がありまして、クラスライブラリ作成時に自動的に作成されるcppファイルをはずすか、
cppの中の #include "test.h" をはずせば何とかリンクが通るようです。
しかし、cppにソース書くなら#include をはずせないし。
実装はすべてヘッダファイルへ、ってことでしょうか。
そういう通例があるというのもどっかで聞いたことがあるような無いような・・
0885デフォルトの名無しさん
2005/12/15(木) 12:15:01VC++では実装はヘッダーファイルに書くことが多いのでしょうか?
クラスライブラリかWindowsフォーム(.NET)か
によっても違うのかもしれませんが。。
0886デフォルトの名無しさん
2005/12/15(木) 12:46:19名前は忘れたけど。
0887デフォルトの名無しさん
2005/12/15(木) 13:47:04メソッド増やして実装を入れたらコンパイルできるようになった気がする
0888デフォルトの名無しさん
2005/12/15(木) 13:50:25STLなんかは全部ヘッダーなんでわ?
>イディオムが存在する。 名前は忘れたけど。
名前があるのは知らなかった。知りたいお。
0889デフォルトの名無しさん
2005/12/15(木) 16:25:47>STLなんかは全部ヘッダーなんでわ?
違うよ。C++用のlibファイルが存在する時点で気づこう。
0890デフォルトの名無しさん
2005/12/15(木) 21:54:22iostreamとかlocale関係はたしかにlibファイルが使われているだろうが,
俺が一般的だと思う意味でのSTLの部分はヘッダに全て実装されている。
(コンテナ・アルゴリズム・イテレータ・関数オブジェクトなど)
0891デフォルトの名無しさん
2005/12/15(木) 22:22:070892デフォルトの名無しさん
2005/12/15(木) 22:32:13WTLは全部ヘッダーだ
0893デフォルトの名無しさん
2005/12/15(木) 22:32:390894デフォルトの名無しさん
2005/12/15(木) 22:51:110895デフォルトの名無しさん
2005/12/15(木) 22:54:120896デフォルトの名無しさん
2005/12/16(金) 01:00:48SGIのオリジナルSTLはそうだね。
STLportやgccのlibstdc++のSTL部分は*.cもある。
■ このスレッドは過去ログ倉庫に格納されています