くだすれC++/CLI(初心者用)part2at TECH
くだすれC++/CLI(初心者用)part2 - 暇つぶし2ch214:デフォルトの名無しさん
11/04/02 17:27:27.97
質問です。
テキストファイルから設定を読み取り、動的にリンクを生成し、別プログラムを起動するランチャーを作っています。
動的にリンクは生成できますが、イベントハンドラに仕込むコールバック関数を動的には生成できないため、
1つのコールバック関数を呼び出しそのなかで起動するプログラムを判断せざるを得ないと考えました。

gcnew System::Windows::Forms::LinkLabelLinkClickedEventHandlerで登録される関数には、
呼び出し元のリンクが引数に渡されるので、cliext::mapで事前に、リンクとコマンドラインの組を格納して判断に用いよう
と考えました。が、リンクのハンドラ( System::Windows::Forms::Label^ )はoperator <が定義されておらず
ソートできないため使用できませんでした。

それではcliext::vectorに、リンクとコマンドラインのcliext::pairを格納しようと思いましたが、どうやらムリみたいです。
実際コンパイルエラーになりました。参考ウェブサイト:
URLリンク(blogs.wankuma.com)
URLリンク(d.hatena.ne.jp)

どうすれば、リンクとコマンドラインの型を管理できるでしょうか。
リンクの型(System::Windows::Forms::LinkLabel)を継承したクラスを定義し、
コマンドラインをメンバ変数として持たせるというのも考えましたがどうも無理やり過ぎる気がします。
何かよい方法はないでしょうか。

215:デフォルトの名無しさん
11/04/02 17:39:23.59
.NETでSTLは使うな
System.Collections.GenericのDictionary<,>使え
というか>>208以降の人はC++/CLIやる前にまずC#やったほうがいい

216:デフォルトの名無しさん
11/04/02 17:45:48.60
>>215
お早い回答ありがとうございます。
> System.Collections.GenericのDictionary<,>使え
どのようなものか、調べてみます。

> というか>>208以降の人はC++/CLIやる前にまずC#やったほうがいい
C++を既に学習しており、基本C++の文法でいける(と私が思う)C++/CLIのほうが新たにC#を学ぶより
よさそうだと考えておりましたが、
今後考えてC#を学ぶことも考えたいと思います。ありがとうございました。

217:デフォルトの名無しさん
11/04/02 17:58:52.75
やったらもう戻ってこないだろう

218:デフォルトの名無しさん
11/04/02 18:01:20.52
コントロールのTagプロパティを使う手もあるけどね
C++/CLIはC++とC#を理解して
その上でもしも両方同時に必要になったときに橋渡しするために嫌々ちょっとだけ使う言語です

219:デフォルトの名無しさん
11/04/02 18:38:49.60
>>218
そんな手もあるのですね。

結局>>214で述べた
> リンクの型(System::Windows::Forms::LinkLabel)を継承したクラスを定義し、
> コマンドラインをメンバ変数として持たせると(略
これで作ってしまいました。今回はこれでいいとして、今後はC#を学んでみたいと思います。
ありがとうございました。

220:デフォルトの名無しさん
11/04/03 17:02:31.86
>>214
手元にあるvs2010では問題なく動いた

221:デフォルトの名無しさん
11/04/03 18:14:41.51
CLIはすぐデザイナが壊れるし
IDEが自動でインデントをぐちゃぐちゃに破壊してくれるので
C++をラップするくらいにしか使わない

222:デフォルトの名無しさん
11/04/03 19:08:09.39
VSの次のバージョンではC++/CLIのWinFormsデザイナは削除したほうがいいと思う
>>219のようなかわいそうな人を生むだけで害悪しかない

223:デフォルトの名無しさん
11/04/03 21:53:39.15
C++もかわいそう
別に「統合」してくれと頼んだわけでもないのに
へんな統合開発環境の下で働かされてる

224:デフォルトの名無しさん
11/04/10 21:32:31.72
繰り返しの多い処理をするとメモリオーバーになってしまいます
どのようにメモリを解放するのですか?

225:デフォルトの名無しさん
11/04/10 21:42:17.88
再現するソース出して

226:デフォルトの名無しさん
11/04/10 21:49:49.30
こういうこと?
URLリンク(www.atmarkit.co.jp)

227:デフォルトの名無しさん
11/04/22 05:33:09.44
C++/CLIのコードをビルドしたアセンブリにアンマネージコードが
含まれてないかチェックする方法って知ってますか?
なぜこういうことを聞くかというとこのクラスライブラリをマネージコードから
使う必要が出てきたためです。

228:デフォルトの名無しさん
11/04/22 10:25:23.73
/clr:pure

229:デフォルトの名無しさん
11/04/22 11:04:57.59
それで分かればいいよねぇ

230:デフォルトの名無しさん
11/04/22 11:11:26.93
意味がわからん
混在アセンブリはマネージコードから使えるけど
セキュリティとか移植性とかでマネージコードしか使えないケースなんだとしたら
まず間違いなく/clr:pureではダメで/clr:safeでないといけない
でも/clr:safeなんて世の中にあるC++/CLIのコードのほとんどがコンパイルできないよw

231:227
11/04/23 09:53:36.44
>>228-230
レスありがとう

> 混在アセンブリはマネージコードから使えるけど
> セキュリティとか移植性とかでマネージコードしか使えないケースなんだとしたら
> まず間違いなく/clr:pureではダメで/clr:safeでないといけない

説明不足でした
とにかくC++/CLIのコードのすべてのパブリックなクラスとメンバに
マネージコードからアクセスできるようにしたいんです
アンマネージコードが含まれてるとそれができないんじゃないかと思って質問しました

232:デフォルトの名無しさん
11/04/23 11:45:11.72
アンマネージコードは含まれててもいい
というかそのためのC++/CLI

233:デフォルトの名無しさん
11/04/23 12:23:54.63
何を持って出来ないと思ったかがポイントかな。
とりあえず動くコードを張っとこう。
VS2010だとこのままで動くし、
VS2005-2008の場合はmanifestをちょこちょこいじる必要がある。

// cl /LD /O1 /clr test1s.cpp
#include <iostream>
class baz { public: void say() { std::cout << "Hello BAZ" << std::endl; }};
public ref class Foo { public: void Say() { std::cout << "Hello FOO" << std::endl; baz b; b.say(); }};
ref class Bar { public: void Say() { std::cout << "Hello BAR" << std::endl; baz b; b.say(); }};

// csc /o /r:test1s.dll test1.cs
using System;
class Program {
 static void Main() {
  new Foo().Say();
  // new Bar().Say();// internalは呼び出せない。
 }
}


234:デフォルトの名無しさん
11/04/23 12:31:41.38
clrをマネージだけで使うとかかなりマゾい人だな

235:デフォルトの名無しさん
11/04/23 14:15:04.04
そんな有り得ないというか無意味な使い方を想定するのは不毛だし
C++/CLIみたら混在しているものと見なせばいいよ

236:227
11/04/23 18:24:35.15
>>232-235
レスありがとう

アンマネージが含まれてもマネージから呼び出せるということだけど
C++/CLIのソースコードで画像処理とかやってて、
例えばビットマップの構造体をnewして先頭からのバイト数でアクセスするとか、
その情報を渡してWin32APIを呼ぶとかしまくってるんだけど、
これってアンマネージにコンパイルされるよね。
こんなメソッドをC#から呼んでまともに動作するんだろうかって心配なんです。


237:デフォルトの名無しさん
11/04/23 19:13:47.90
やっぱり、Managed Unmanagedの意味を取り違えてたか。
その程度ならManagedでコンパイルされてるよ。ただしunsafeだけどね。

238:227
11/04/24 11:33:12.50
>>237
マネージだけど暗黙的にunsafeとしてコンパイルされるから
アンマネージのように構造体やポインタが使えるってことか。
納得した。ありがとう。


239:デフォルトの名無しさん
11/04/24 19:03:40.58
文字列を逆順にするプログラムを書こうとした場合、自分で考えると以下のようになりました。

---------------------------
#include <string>

string str = "abcde"
string new_str;

int i;
int length = str.size();
for (i=0; i<length; ++i) {
new_str[i] = str[length-i-1];
}
---------------------------

なにかかカッコ悪い感じがするのですが、
一番スマートな書き方はどのような感じになりますでしょうか?

PHPのarray_popみたいのがあったらwhileで回して綺麗にかけると思うのですが、
C++のstringライブラリにありましたでしょうか?

あと、C++では i++は++iの方がよいと誰かに教わったのですが、理由を忘れてしまいました。
何故でしたでしょうか・・?

ご教示いただけますと幸いです。


240:デフォルトの名無しさん
11/04/24 19:23:40.94
スレ違い

241:239
11/04/24 19:27:37.31
すみません

242:デフォルトの名無しさん
11/04/24 19:43:51.75
このスレ的にはこういう回答になる(笑
// cl /FUSystem.Core.dll /clr:safe test2.cpp
using namespace System;
using namespace System::Linq;
int main(array<String^>^ args) {
  String^ str = "abcde";
  String^ new_str = gcnew String(Enumerable::ToArray(Enumerable::Reverse(str)));
  Console::WriteLine(new_str);
}

拡張メソッドは使えなかったっけ?ちとスマートじゃないな。

243:デフォルトの名無しさん
11/04/24 20:55:50.28
WCHAR [32]' から 'System::Object ^' に変換できません

というエラーがでた場合、どういう変換処理をかいたらいいんでしょうか??

244:デフォルトの名無しさん
11/04/24 21:08:28.84
System::Object^ v_obj = gcnew System::String(v_wchar);


245:デフォルトの名無しさん
11/04/24 22:09:06.50
たぶんこれかな

msclr::interop::marshal_as

246:デフォルトの名無しさん
11/04/24 22:36:22.37
>244
ありがとうございました。その逆の変換はどうするんでしょうか?

247:デフォルトの名無しさん
11/04/24 23:47:43.19
>>242
今時サロゲートペアすら考えないコーディングは絶滅すべき

248:デフォルトの名無しさん
11/04/25 04:59:47.67
>>246
URLリンク(msdn.microsoft.com)

249:デフォルトの名無しさん
11/04/27 16:00:21.03
>>247
サロゲートペア対応に挑戦しようと思うのだが、VS2010expressのコンパイラでエラーになる。
なんかスマートな対応方法ないすか?


literal String^ str = L"「叱る」と「\uD842\uDF9Fる」";

error C3850: '\uD842': ユニバーサル文字名が無効な文字を指定しています。
error C3850: '\uDF9F': ユニバーサル文字名が無効な文字を指定しています。


250:デフォルトの名無しさん
11/04/27 21:36:58.89
>>249
ググると𠮟るのユニコードは「20B9F」となってるけど。

251:デフォルトの名無しさん
11/04/27 21:40:24.11
textBoxに入力した文字を分割して配列に割り当てる方法がわかりません

252:デフォルトの名無しさん
11/04/27 22:11:33.08
C# 文字列 分割 でググれ
C#だぞ。C++/CLIじゃないぞ。

253:デフォルトの名無しさん
11/04/27 23:46:28.19
>>249
\uxxxxじゃなくて\UxxxxxxxxでUTF-32使って指定するとか?

254:249
11/04/29 10:49:09.60
>>250,253
CLRは内部コードが16bitのユニコードなのでこうなちゃうんですね。

C#はこれでいけるのですけどね;;
const string msg = "「叱る」と「\uD842\uDF9Fる」";

とりあえず、これで対応しました。
array<wchar_t>^ cmsg = { L'「', L'叱', L'る', L'」', L'と', L'「', 0xD842, 0xDF9F, L'る', L'」' }; 
String^ msg = gcnew String(cmsg);

サロゲート対応のコードを書いてみました。
URLリンク(ideone.com)

255:デフォルトの名無しさん
11/04/29 11:04:15.35
string.Concat(
 StringInfo.GetTextElementEnumerator(s)
 .Cast<string>()
 .Reverse()
 .ToArray()
)
でええやん(めんどくさいからC#)

256:デフォルトの名無しさん
11/04/29 12:57:21.31
サロゲートと聞くと松田聖子を思い出す

257:デフォルトの名無しさん
11/04/29 13:17:08.71
.GetTextElementEnumeratorの戻値はIEnumerableじゃくて
IEnumertorだから直接Linqにつなげない。

258:デフォルトの名無しさん
11/04/30 13:14:38.20
文字をシフトJISに変換する方法

259:デフォルトの名無しさん
11/04/30 13:32:03.61
一行で様々な疑問を出させる才能

260:デフォルトの名無しさん
11/05/14 13:44:13.14
C++/CLIの具体的な難点ってなんでしょうか?
少し触ってみたところ、GUIも作り易い感じがするしCライブラリも簡単に使えそうだし、
いったいどういう問題があるのかなと気になりました
(VC++2008EEなのでintellisenseもとりあえず大丈夫です)

261:デフォルトの名無しさん
11/05/14 21:00:19.76
C#やVBと比較して生産性が遥かに劣る
それだけ

262:デフォルトの名無しさん
11/05/14 21:23:06.33
>>261
できればもうちょっと具体的にお願いします

263:デフォルトの名無しさん
11/05/14 21:55:07.50
・C++言語ではなくではなくてC++/CLI言語であること、
 C++/CLI独特の文法を覚える必要がある。C#との互換性もない。
・使う人が少ないので情報が少ない
・Intelisenceの不具合が多い(例え2010でも逃れられない)
・中途半端にネイティブなのでCLRとしての最適化も中途半端。

264:デフォルトの名無しさん
11/05/14 22:05:31.03
Cのライブラリ使うにしても、DllImportの手間を差し引いてもよっぽどでなきゃC#の方が楽なんだよね

265:260
11/05/15 19:08:05.61
どうもありがとうございます
Visual C#を試しに入れてみたところ、
何だこれは…ひょっとしてC++/CLIだけでなくVisual C++自体が手抜き…?と思ってしまいました
これだとたしかに生産性に差が出るかもと思うと同時にMSの露骨な贔屓に少し閉口してしまいました
まだほんの入口ですしCライブラリについて不安はありますが、とりあえず使ってみようと思います

266:デフォルトの名無しさん
11/05/15 23:25:23.90
VC++はネイティブC++の開発環境としては現在最高だろ
言語そのものがインテリセンスやRADに向いてない
C++にはC++にしかできないことをやらせるとMSは言ってるので
フォームデザイナを使うような用途へのサポートが強化されるようなことは今後も期待できない
C++はネイティブ特化、C++/CLIは橋渡し専用

267:デフォルトの名無しさん
11/05/16 00:10:28.27
まだVS2010のC++/CLIのインテリセンスないのか
この分だともうずっと出ないだろうな

268:デフォルトの名無しさん
11/05/16 09:33:24.32
2010で外されたってことは、MSは諦めたってことなじゃないの?

269:デフォルトの名無しさん
11/05/16 10:32:51.80
いや、次のバージョンでは復活させるって言ってる。
問題は「次」というのがSP2なのかVS2014とかになるのかが分からないこと。

270:デフォルトの名無しさん
11/05/16 10:37:08.05
その前にC++/CLI自体が…
今やMSにとってはATLでCOM触るラッパーを書くためだけの言語だからなあ

271:デフォルトの名無しさん
11/05/24 01:29:53.63
/*********************************/
/* __finallyブロックは何のために */
/*********************************/
try {
throw 128;
} catch (int num1) {
System::Console::WriteLine("catchブロック: num1 == {0}", num1);
} __finally {
System::Console::WriteLine("__finallyブロックって何の意味があるのか疑問だな");
}
System::Console::WriteLine("__finallyブロックがなくても、throwの有無にかかわらずここで実行できるじゃないか。");

272:デフォルトの名無しさん
11/05/24 21:38:05.21
だがその処理の呼び出し元でcatchしたかった時はどうする?
C++なら自分で再throwする必要があるが、
finallyを使えばそういうことを考える必要がない。

ついでに言うと、finallyブロックは
例外が起きようとも起きなかろうとも、
breakやreturnで抜けても必ず実行されるので
ファイルの閉じ忘れなどを回避する実に有効な手段である。

273:デフォルトの名無しさん
11/05/24 23:17:43.72
スタック割当構文じゃだめなの。

274:デフォルトの名無しさん
11/05/25 23:31:46.12
>>273
だいたいそれで間に合うとは思う。
auto_handleやauto_gcrootの助けもあるしな。

まあ、今までのVisual C++にも__finallyあるし、C#にもfinallyあるし、
あえてC++/CLIに__finallyを搭載しない理由もないと言ったところでは?

275:デフォルトの名無しさん
11/05/26 01:03:44.37
使ったオブジェクトのデストラクタ呼ぶだけでいいケースは確かに多いけどそうじゃないときもあるだろ
その場限りのちょっとした後処理のためにもいちいちクラス作るの?

276:デフォルトの名無しさん
11/05/26 05:07:03.51
超初心者です。
教えてほしいのですが、
hoge(int *piyo)は
hoge(int^ piyo)と
してるのですが
hoge(int **piyo)は
どのように書き換えれば良いのでしょうか
すいませんが教えてください



277:デフォルトの名無しさん
11/05/26 12:12:03.85
array<int^>^ piyo とか?

278:デフォルトの名無しさん
11/05/26 20:22:59.15
/* Hashtableのポインターへのポインターがコンパイルエラー */
using namespace System;
using namespace Collections;
const char *pc1;
const int nmax = 4;
// const char * の任意の要素数のデータを動的にメモリを割り当てて使う
const char **ppc1 = new const char *[nmax];
int n1 = 0;
*(ppc1 + n1++) = "higasi";
*(ppc1 + n1++) = "nisi";
*(ppc1 + n1++) = "minami";
*(ppc1 + n1++) = "kita";
for (n1 = 0; n1 < nmax; ++n1) {
pc1 = *(ppc1 + n1);
Console::WriteLine(gcnew String(pc1));
}
// 同様の手段で、Hashtable ^^ にメモリを動的に割り当てて任意の数
// のHashtable ^ を格納しようとするとコンパイルエラー
ArrayList ^pArrayList1 = gcnew ArrayList();
for (n1 = 0; n1 < nmax; ++n1) {
pArrayList1->Add(gcnew Hashtable());
}
Hashtable ^pHashtable1, ^pHashtable2;
Hashtable ^^ppHashtable1 = gcnew Hashtable ^[nmax]; // コンパイルエラー
ppHashtable1 = gcnew Hashtable ^[nmax];
for (n1 = 0; n1 < nmax; ++n1) {
pHashtable1 = dynamic_cast<Hashtable ^>(pArrayList1[n1]);
// ^(ppHashtable1 + n1) = pHashtable1; // コンパイルエラー
// pHashtable2 = ^(ppHashtable1 + n1); // コンパイルエラー
pHashtable1 = pHashtable2 = nullptr;
}


279:デフォルトの名無しさん
11/05/26 20:26:26.71
このコンパイルエラーになる
System::Collections::Hashtable ^^ppHashtable1;
って何とかならんかいな。多重ループで毎回dynamic_cast演算子使ってる
と効率悪いだろうし。

280:デフォルトの名無しさん
11/05/26 20:45:23.45
delete [] ppc1; を忘れとった。
それと、ppHashtable1 = gcnew Hashtable ^[nmax];
の行も 「// コンパイルエラー」を忘れ取った。

281:デフォルトの名無しさん
11/05/27 01:02:41.42
なんていうか、C++ のことは忘れた方が良いよ

282:デフォルトの名無しさん
11/05/27 03:30:26.71
/* cli::array を使ってもコンパイルエラーかいな、難しいもんだな */
cli::array<Hashtable^> ^ppHashtable1 = gcnew cli::array<Hashtable ^>[nmax];
IEnumerator ^pIEnumerator1;
pArrayList1->GetEnumerator();
while (pIEnumerator1->MoveNext()) {
pHashtable1 = dynamic_cast<Hashtable ^>(pArrayList1[n1]);
^(ppHashtable1 + n1) = pHashtable1;
pHashtable2 = ^(ppHashtable1 + n1);
pHashtable1 = pHashtable2 = nullptr;
}
pIEnumerator1 = nullptr;


283:デフォルトの名無しさん
11/05/27 03:33:53.23
間違えた
pHashtable1 = dynamic_cast<Hashtable ^>(pArrayList1[n1]);
の行は間違いで正しくは
pHashtable1 = dynamic_cast<Hashtable ^>(pIEnumerator1->Current);
だった。

284:デフォルトの名無しさん
11/05/27 04:48:38.33
using namespace System;
using namespace Collections;

typedef Hashtable^ pHashtable;
pHashtable pHashtable1 = gcnew Hashtable();
pHashtable pHashtable2 = gcnew Hashtable();
pHashtable pHashtable3 = gcnew Hashtable();

pHashtable *ppHashtable1;
ppHashtable1 = &pHashtable1; // 可能
ppHashtable1 = nullptr;
// ppHashtable1 = new pHashtable; // コンパイルエラー
// delete ppHashtable1;
// ppHashtable1 = nullptr;
// const int nmax = 3;
// ppHashtable1 = new pHashtable[nmax];
// delete [] ppHashtable1;

new演算子が使えないならSTLのvectorなら何とかなるんだろうか。
でも、.NET Framework 2.0 SDKをダウンロードしたものでは標準ライブラリの
ヘッダーファイルを#includeできないからアンマネージは使えない。

285:276
11/05/27 05:15:05.02
中途半端な質問をしてすいませんでした。
>>277さんレスありがとうございました。
実はDirectXのBaseClassesをCLIで書いてるのですが
GetSyncSource( [Out]IReferenceClock** pClock) ;
(IReferenceClockはmanagedインターフェイスです)
の部分をどう書けば良いかわからないです。
interior_ptrというのを使えと出てきますが、使い方がよくわかりません。
どう書けば良いか、どなたかご教示ください。

286:デフォルトの名無しさん
11/05/27 05:52:09.46
静的配列も作成できないのか。これもエラーになるのか。
typedef System::Collections::Hashtable ^pHashtable;
pHashtable pHashtable_hairetu[8];
マネージなクラスというのはどうしようもないな、困ったもんだ。

287:デフォルトの名無しさん
11/05/27 06:13:49.43
これもエラーになるのか。
やっぱりArrayListのままで甘んじるしかないようだな。
typedef System::Collections::Hashtable ^pHashtable;
pHashtable *pHashtable1 = new pHashtable();
char *pc1 = reinterpret_cast<char *>(&pHashtable1);
pc1 = reinterpret_cast<char *>(&pHashtable1);
pHashtable pHashtable2 = *(reinterpret_cast<pHashtable *>(pc1));
CLIってぼろいな。

288:デフォルトの名無しさん
11/05/27 23:37:00.98
マネージドクラスをネイティブクラスでラップしてから配列に入れるとか・・
C++/CLIは異なる言語が同居する2世代住宅言語だからなぁ。
#include <msclr/auto_gcroot.h>
using namespace msclr;
using namespace System;
ref struct Foo {
 void Say() { Console::WriteLine("Hello World !"); }
};
struct Bar {
 auto_gcroot<Foo^> foo; 
 Bar() : foo(gcnew Foo()) {}
};
int main(array<String^>^ args) {
 Bar bs[] = { Bar(), Bar(), Bar() };
 for (int i=0; i<3; i++) bs[i].foo->Say();
}


289:デフォルトの名無しさん
11/05/28 06:57:48.67
もうちょっと改良
#include <msclr/auto_gcroot.h>
using namespace msclr;
using namespace System;
ref struct Foo {
 void Say() { Console::WriteLine("Hello World !"); }
 Foo() { Console::WriteLine("Foo Created"); }
 ~Foo() { Console::WriteLine("Foo Deleted"); }
};
typedef auto_gcroot<Foo^> foo;
int main(array<String^>^ args) {
 foo ag[] = { gcnew Foo(), gcnew Foo(), gcnew Foo() };
 for (int i=0; i<3; i++) ag[i]->Say();
}


290:276
11/05/28 08:14:55.34
すいませんが再度質問さしていただきます
C++で
class Foo{
--色々なメソッドやメンバ--
}
である別のクラスのメソッドで
void Piyo(Foo **hoge);というのがあり
渡す値がFoo* fooとして
Piyo(&foo);とするとします。
これをCLIで実現するにはどのようにすればよいでしょうか
どなたかご教示ください。

291:デフォルトの名無しさん
11/05/29 00:06:15.74
質問の意図が良く分からないけど、こんな感じの回答でいい?
using namespace System;
ref class Foo {};
void Piyo(Foo^ %hoge) {
  hoge = gcnew Foo();
}
int main(){
  Foo^ f = nullptr;
  Piyo(f);
  Console::WriteLine(f);
  Foo f2;
  Piyo(%f2);
  Console::WriteLine(%f2);
}


292:デフォルトの名無しさん
11/05/30 12:26:48.80
.NET的には単にreturnで返すのが普通
どうしても参照渡しでやりたいなら
void Piyo([System::Runtime::InteropServices::OutAttribute]Foo^ %hoge)
こう書くのが.NET的には正解
クラスライブラリ作ってるんでなければ好きにすればいいけど

293:276
11/06/01 06:53:05.38
ありがとうございました。
たいへん参考になりました。

294:デフォルトの名無しさん
11/06/01 07:08:44.99
教えてほしいんですが。
C,C++なら
typedef union
{
int a;
short b;
double d;
}Union;
としたらUnionのサイズはsizeof(double)で
Union u = 1;としたら、aに1が入ると思うんですが。
CLIで
[StructLayout(LayoutKind::Explicit)]
ref struct Union
{
[FieldOffset(?)]int a;
[FieldOffset(?)]short b;
[FieldOffset(?)]double d;
};
と宣言したとして、?の部分には何の数値を入れればよいのでしょうか。
ヘルプを見ると「フィールドの物理的な位置を示します。」
と書かれているのですが、馬鹿なんでわかりません。
どなたか教えてください。



295:デフォルトの名無しさん
11/06/01 21:57:49.20
C++/CLIにおけるジェネリックメソッドとテンプレート関数の違いを説明してくださいお願いします

296:デフォルトの名無しさん
11/06/03 21:20:40.48
>>294
全部0
>>>295
テンプレートはただの言葉遊び
ジェネリックは実行時に展開される
DLLを作る場合、アセンブリのパブリックメンバにテンプレートを使ってはいけない

297:デフォルトの名無しさん
11/06/04 14:38:11.46
DirextXXinputのXInputGetState関数実行の格納先構造体

struct CONTROLER_STATE
{
XINPUT_STATE lastState;
XINPUT_STATE state;
DWORD dwResult;
bool bLockVibration;
XINPUT_VIBRATION vibration;
};

をC#で受け取れるようにするにはどうすればいいんですか?
ラップというのはどういう流れになるんですか?C++/CLIの本2冊読んだんですが解説コードからちょっとでも違うと全くわからないです
今のところの認識は、
structをそのままrefクラスに入れる>エラー大量
structの前にrefをつける>エラー大量
structから一つ一つ値を完全にC++/CLIで作った構造体に抜き出し、その構造体をC#から読み込む>これなら当然できる
ラップするとはどういうことなんでしょうか

298:デフォルトの名無しさん
11/06/04 15:04:33.10
本二冊読んでvalue classが出てこないってありえるのか…?

299:デフォルトの名無しさん
11/06/04 15:58:05.32
どういうことですか?structの前にvalueをつけたら混合型はサポートされていませんというエラーがでます

300:デフォルトの名無しさん
11/06/04 17:21:15.05
そりゃ、ref や value をつけたら C++/CLI の管理だからな
通常の C++ のポインタとか持ってちゃ、混合型になるだろ

301:デフォルトの名無しさん
11/06/04 17:47:19.16
>>297
> structから一つ一つ値を完全にC++/CLIで作った構造体に抜き出し、その構造体をC#から読み込む
もちろんこれ
単純に書くだけなら直接C#でも大して手間の差はない

302:デフォルトの名無しさん
11/06/04 18:50:06.15
まじですか・・・
何かものすごい事を期待していました・・・

303:デフォルトの名無しさん
11/06/04 19:05:39.17
ってC++CLI使わなくても直接C#からXinput呼べるんですか?
どうやるんですか?

304:デフォルトの名無しさん
11/06/04 19:19:52.39
PInvoke で渡す構造体はC#側で用意してあげればいい

305:デフォルトの名無しさん
11/06/04 20:30:56.92
ありがとうございます
意味が全く分かりませんがPInvokeを調べてみます

306:デフォルトの名無しさん
11/06/04 20:31:25.24
XInputだったらXNA使えよ

307:294
11/06/05 04:08:13.35
>>296さん
ありがとうございました。

308:294
11/06/07 07:00:08.28
再度質問さしていただきます
struct Hoge
{
union
{
DWORD dwGBitMask;
DWORD dwUBitMask;
DWORD dwZBitMask;
DWORD dwBumpDvBitMask;
struct
{
WORD wFlipMSTypes;
WORD wBltMSTypes;
} MultiSampleCaps;
};

ref struct Hoge
{
[StructLayout(LayoutKind::Explicit)]
ref struct Union
{
[FieldOffset(0)]DWORD dwGBitMask;
[FieldOffset(0)]DWORD dwUBitMask;
[FieldOffset(0)]DWORD dwZBitMask;
[FieldOffset(0)]DWORD dwBumpDvBitMask;
とまでしたのですが、
struct MultiSampleCaps
{
WORD wFlipMSTypes;
WORD wBltMSTypes;
}
の部分はどのように書けば良いのでしょうか、すいませんが教えてください。

309:デフォルトの名無しさん
11/06/07 13:08:48.20
C++/CLIでわざわざマネージ型をP/Invokeに使う意味がわからん。
しかもよりによってなぜ今時DirectDrawなのか。
[StructLayout(LayoutKind::Sequential)]struct MultiSampleCaps { ここは同じでオフセットも不要 }
/*Hogeの中*/[FieldOffset(4)]MultiSampleCaps MultiSampleCaps;
.NET関連で調べ物するときのキーワードはC++/CLIじゃなくてC#ね。
情報量1000倍だから。アホらしいと思ったらC#へどうぞ。

310:デフォルトの名無しさん
11/06/08 20:55:56.86
VC++6.0のMFCなプログラムとVC++2008 Express Edition の.NETなプログラムで
プロセス間通信したいのですがどうすればいいですか。


311:デフォルトの名無しさん
11/06/08 22:03:55.29
WM_COPYDATAとか手軽でいいんじゃないか

312:デフォルトの名無しさん
11/06/08 22:35:11.37
もしくは共有メモリ。DDEでも動くぜ。

313:デフォルトの名無しさん
11/06/22 01:29:30.29
Graphicsをつかって1ドット書きたいのですが方法在りますか?
g->DarwLineだと2ドット最小?

314:デフォルトの名無しさん
11/06/22 06:08:56.94
FillRectangle

315:デフォルトの名無しさん
11/06/22 11:33:33.87
g->FillRectangle(Brushes::White, 0, 0, 1, 1);
できた!

これからc++/cliするのとc#するのどっちがいいですか?
GPGPU & direct Xやるとしたらc++の方向のほうがいい?

316:デフォルトの名無しさん
11/06/22 11:48:19.12
C++かC#の2択、C++/CLIは無い

317:デフォルトの名無しさん
11/06/22 12:42:08.36
ありがと、c++でいく

318:デフォルトの名無しさん
11/06/22 13:44:22.22
GPGPUやDirectXならC++のみじゃね?
C#だとラッパー使うことになるし

まぁ、C++/CLIだけは無いけど

319:デフォルトの名無しさん
11/06/23 10:09:33.25
C++/CLIを使おうとした初心者を思いとどまらせるスレになってるな

320:デフォルトの名無しさん
11/06/23 10:20:17.40
進む先が地獄であることを知らない奴を追い返してやるのは当然だろう

321:デフォルトの名無しさん
11/06/23 10:50:11.25
何も知らないでVisualC++使ってWindowsアプリを作ろうと思うと、
自動的にC++/CLIになるからなー

MSは鬼や

322:デフォルトの名無しさん
11/06/24 00:13:45.93
.NET FrameworkとC++を知ってればどうって事無い

323:デフォルトの名無しさん
11/06/24 00:20:14.62
333

324:デフォルトの名無しさん
11/06/24 06:58:51.76
C++だけよりは、UI作るのは楽。

325:デフォルトの名無しさん
11/06/24 14:45:59.69
C++だとUI作り辛いし、C#だとネイティブじゃないから、
C++/CLIを使えば良いんじゃね?

326:デフォルトの名無しさん
11/06/24 14:52:10.85
こうしてC++/CLIを勘違いした犠牲がまたひとり・・・

327:325
11/06/24 15:04:02.96
と、思っていた時期が俺にもありましたってだけ
MSは頑張って理想通り完成させてくれよう
むしろ諦めたっぽいがw

328:デフォルトの名無しさん
11/06/24 23:04:13.78
正直、むしろ起動速度や処理の即応性とかの GUI こそ C++ でやって、ロジックとかに
.net fw を使うための言語だと思うんだが

329:デフォルトの名無しさん
11/06/26 11:43:42.77
C++とC#を使いこなしたうえで両方を使うために
C++/CLIというならいいけど、両者の利点を
生かすためにいきなりこれ、というのは無理w

330:デフォルトの名無しさん
11/06/27 09:26:00.43
>>328
起動速度や応答性を気にしないなら、C#で十分ってことだな

331:デフォルトの名無しさん
11/06/27 10:22:03.55
いや起動速度はC#と変わらないよ
ネイティブのDLLを読み込む分遅くなることはあっても速くなることはない
それからアンマネージコードとマネージコードの境界を越えるオーバーヘッドは馬鹿にならないので
下手するとマネージコードだけの方が速い

332:デフォルトの名無しさん
11/06/27 10:36:48.76
さらにC++/CLIの存在価値が下がったw
本当にラッパー専用言語だな

333:デフォルトの名無しさん
11/06/27 12:13:07.27
C++にGCを入れろと言う要望への、一つの回答。
D言語も悪いところも見えてくる。

334:デフォルトの名無しさん
11/06/27 15:06:24.73
ラッパーなら別にネイティブでいいんだよなぁ

335:デフォルトの名無しさん
11/06/27 17:47:56.62
C++/CLIがなかったら
どうやってラップするの?

336:デフォルトの名無しさん
11/06/27 18:01:37.46
C#-->C++は簡単だけど、逆は面倒。

337:デフォルトの名無しさん
11/06/27 18:03:44.31
別にスタティックライブラリだろうがC++ライブラリだろうが
なんでもかんでもDLLに包んでP/Invokeでおk

ObjCコンパイラ以上の荒業でラッパーコードが書けるのがC++/CLIの醍醐味だけど
なんか、こう、便利とは違うんだよなあ…

338:デフォルトの名無しさん
11/06/27 18:05:53.91
マネージドで、ポインタを使いまくれる。

339:デフォルトの名無しさん
11/06/27 19:58:57.49
C#でできなくてC++/CLIでなら可能なポインタ関係の操作ってあったっけ?
C#のunsafeの方が簡潔にCっぽく書けて扱いやすい気がするんだが

340:デフォルトの名無しさん
11/06/28 09:14:21.36
C#はMarshal派

C++のUIだけC++/CLIやC#みたいに自動で作ってくれるC++は無い物か
BCBなら出来るけどさ

341:デフォルトの名無しさん
11/06/28 21:35:58.12
BCBでやれば万事解決

342:デフォルトの名無しさん
11/06/29 14:14:27.30
MSからBCB出してくんねーかな
C++/CLIは無かったことにして、買収しちゃえばそれで済むのに

343:デフォルトの名無しさん
11/06/29 23:59:08.75
だからC++/CLIは「WinFormsが使えるC++」なんて生易しいものじゃないと何度言えば

344:デフォルトの名無しさん
11/06/30 07:08:43.64
Windowsは、C++でプログラミングが基本。

345:デフォルトの名無しさん
11/06/30 08:58:03.95
なぜC++は易しいのにC++/CLIは易しくないのか?
みたいな無神経な言い回しが何度も言われていた時期があった。

聞くほうも同じくらい無神経だから何度言っても通じないことは容易に想像できる。

346:デフォルトの名無しさん
11/06/30 09:30:47.84
まあネイティブのC++でGUI作るよりはずっと簡単だけど
C++/CLIでWinForms使うなっていうのは
どうせC#わからないと使えないしC++の経験があってもC#覚えたほうが早いからC#やれってこと
C++の経験があるからC++/CLIがいいだろうと思って始めた初心者が
C#のTIPSサイトですぐ出てくるようなコントロールの使い方を質問してくるとそりゃC#やれと言いたくなる

347:デフォルトの名無しさん
11/06/30 09:58:07.10
>>344
Windowsでの基本はC++だが、
WinFormでの基本はC++じゃない件

348:デフォルトの名無しさん
11/06/30 16:10:30.57
せめてVB並みのインテリセンスを実装してくれ

349:デフォルトの名無しさん
11/06/30 16:29:27.88
2010にインテリセンスのらないの確定か
vNextも最初のバージョンは載らないらしいし

350:デフォルトの名無しさん
11/06/30 23:34:53.54
GUIでUI設計ができてネイティブコードその上爆速コンパイル
Borland時代のDelphiはまさに神言語だったんだなぁと思う

351:デフォルトの名無しさん
11/07/01 00:31:39.48
C#がネイティブコード吐く言語だったとしてもコンパイルは爆速のはずだよ
C++の言語仕様が糞なだけ

352:デフォルトの名無しさん
11/07/01 00:57:16.04
Scalaはコンパイル遅いけど糞なのか?

353:デフォルトの名無しさん
11/07/01 09:30:18.33
C#も多次元配列とか使わなければ速いよ

354:デフォルトの名無しさん
11/07/01 09:37:09.00
Cが速いのは、安全性と裏腹。

355:デフォルトの名無しさん
11/07/01 09:53:59.45
Cでも安全性は確保可能

356:デフォルトの名無しさん
11/07/01 17:08:23.75
理屈では可能でも
現実の大部分のプログラムはそうなってないんだけど

357:デフォルトの名無しさん
11/07/01 20:01:09.19
そうか?
それだと原発事故と飛行機事故と自動車事故と比べて騒いでる連中と同じだぞ

358:デフォルトの名無しさん
11/07/01 21:01:16.07
Cは標準ライブラリが安全性を確保するのが難しい作りになってるだけで、
使うライブラリによっては安全に書ける、気がする

359:デフォルトの名無しさん
11/07/01 21:35:52.26
セキュリティは別にして、.NETはメモリ破壊が起きないのがいい
お前はもう死んでいる的なバグがずっと少ない

360:デフォルトの名無しさん
11/07/01 22:42:12.30
ガベコレは、理論武装とかしなくても安全性が明らかだから好感を持てるんだが、
逆に言うとガベコレ使わなくても明らかに安全な部分はCで書いていい

361:デフォルトの名無しさん
11/07/05 10:04:29.39
C++/CLIはやれば出来る子
計算部分はネイティブで書いて、GUIや描画部分は.NETにやらせることで
高速かつ生産性の高いプログラミングが出来る

・・・と、言う夢だったのさ

362:大天使 ◆uL5esZLBSE
11/07/05 13:17:03.75
>>357
Cは安全性を捨てて速度得てんだよ バカか?
Cに安全性を追加したら
それは劣化C#になるから、下手に自分でかいた甘いコードで安全性をはかるよりも
C#でやるべき

お前はなんか、C++上で劣化C#作って喜んでそうなバカだな

363:デフォルトの名無しさん
11/07/05 15:20:27.62
自演乙

364:デフォルトの名無しさん
11/08/17 15:46:40.55
VS2010で作っちゃったんだけど、VS2008に変換することって出来ます?
インテリセンス無いから入力がめんどくさい・・・

365:デフォルトの名無しさん
11/08/17 21:56:13.11
無理
一応注意しとくと2008でコンパイルした混在アセンブリは.NET4でロードできなくなるよ?

366:デフォルトの名無しさん
11/08/17 22:07:00.37
あとはアドイン購入か。
URLリンク(www.wholetomato.com)

367:デフォルトの名無しさん
11/08/17 23:11:17.61
新規プロジェクトにコードだけ引っ越した方が簡単な気がするけど

368:デフォルトの名無しさん
11/08/18 15:44:09.37
俺もそう思う
projファイル書き替えでなんとかなるけどね
混在はapp.config無理やりつけてやるとか

369:デフォルトの名無しさん
11/08/31 22:00:08.56
プロジェクトをいちいち作るのがめんどくさい…

370:デフォルトの名無しさん
11/09/02 22:58:08.40
MSBuild 用のXMLなんだから、直接修正しろよ

371:デフォルトの名無しさん
11/09/13 13:37:36.74
どうでもいい事だよ C++/CLI で better C なんて

372:デフォルトの名無しさん
11/09/16 11:52:55.12
URLリンク(msdn.microsoft.com)
なんかわけのわからないことになってるぞ
C++/CLI切ってネイティブのC++にC++/CLI風のCOM拡張を入れるらしい

373:デフォルトの名無しさん
11/09/16 13:18:45.29
切るんじゃなくてWinRT API用の拡張。
.net framework用には今まで通りC++/CLIを使う。

374:デフォルトの名無しさん
11/09/16 14:44:53.44
.NETとCOMで共通のAPIを用意して、C++は完全ネイティブでCOM使うっていうのは
C++/CLIに比べれば至極真っ当なやり方だと思う
最初からそうしてくれてれば良かったのに

375:デフォルトの名無しさん
11/09/16 21:24:20.48
>>374
それではプラットホームに依存してしまう。

376:デフォルトの名無しさん
11/09/16 21:42:24.87
C++/CLIってCLI拡張の部分は標準化されてるけど
ネイティブコードとどう結びつけるかは実装依存でしょ
CLIに依存する記述だけ言語仕様から削ればCOMとのバインディングは実装次第ってことで問題ない

377:デフォルトの名無しさん
11/09/19 03:32:40.73
Win32アプリケーションとして作成したプロジェクトで、
作成されたウィンドウに.net framework用のコントロールを
貼ることは可能でしようか?

378:デフォルトの名無しさん
11/09/19 06:50:32.14
つ CWinForm...

URLリンク(msdn.microsoft.com)(v=VS.80).aspx

379:デフォルトの名無しさん
11/09/19 15:35:43.23
>>378
ありがとうございます。
MFCのCViewの派生なんですね。
CView系は使いたくないのでちょっとソースを読んでみます。

380:デフォルトの名無しさん
11/09/19 20:45:06.45
別にソース読まなくても、CWinFormsControl じゃ駄目なの?

381:デフォルトの名無しさん
11/09/20 22:52:53.28
>>380
CWinFormsControl で大丈夫そうですね。
ご指摘ありがとうございます。

382:デフォルトの名無しさん
11/09/26 15:27:11.67
>>362
多分わかってるだろうけど、おかしいよ。
Cは安全性を捨ててなんていない。安全性なんて無かった。

383:デフォルトの名無しさん
11/10/12 15:19:32.05
もともと持ってないものは捨てられないわな

384:デフォルトの名無しさん
11/10/16 23:44:09.15
WebBrowserコントロールにNewWindow2イベントを実装する
URLリンク(main.tinyjoker.net)

これをVC2008でやりたいんですけどどう書けばいいか分かる人いますか・・・

385:デフォルトの名無しさん
11/10/16 23:51:00.77
C++/CLIならほとんど何も違わないが
C++/CLIはC++じゃないけどそれはわかってる?
そんな質問するような人がなんでC++/CLIなんか使うのか正直意味がわからない
素直にC#使うか、C++やりたいんだったらネイティブでATLやMFC使ったほうが

386:デフォルトの名無しさん
11/10/17 13:53:12.58
初心者用といっても、.NETとC++はマスターしてないと。

387:デフォルトの名無しさん
11/10/17 14:51:10.32
>>384>>385の意味がわかるまで精進しましょう

388:デフォルトの名無しさん
11/10/17 15:51:31.18
むしろ初心者はC++/CLI使うな

389:デフォルトの名無しさん
11/10/29 09:05:13.17
今までFormで自動で作る機能でストリップメニューを作ってたのですがそうすると一個づつthis->A = gcnew... this->B = gcnew...
みたいな感じで作られてしまって、ABCのときもあればABCDEの時もあるようにしたいので
ループみたいな感じでまとめたいのですが
array<System::Windows::Forms::ToolStripMenuItem>^ strips = gcnew array<System::Windows::Forms::ToolStripMenuItem>(5); というやり方だとは教わったのですがこれをメニューアイテムに登録するときに
this->StripMenuItem1->DropDownItems->AddRange(gcnew cli::array< System::Windows::Forms::ToolStripItem^ >(5) {this->AToolStripMenuItem,this->BToolStripMenuItem,this->CToolStripMenuItem・・・}
と書いてたのですがここはどうすれば良いでしょうか?

390:デフォルトの名無しさん
11/10/29 09:24:47.38
その前にusing namespace System::Windows::Forms;を入れることを激しくおすすめするw

391:デフォルトの名無しさん
11/10/29 09:30:46.12
どういうことですか?わかりやすく説明してください

392:デフォルトの名無しさん
11/10/29 09:50:02.99
array<System::Windows::Forms::ToolStripMenuItem^>^ じゃないの
っていうかC++/CLIなんかやめてC#やれ

393:デフォルトの名無しさん
11/10/29 09:53:37.07
>>392
ありがとうございます
そこは直しました
this->StripMenuItem1->DropDownItems->AddRange(gcnew cli::array< System::Windows::Forms::ToolStripItem^ >(5) {this->AToolStripMenuItem,this->BToolStripMenuItem,this->CToolStripMenuItem・・・}
ここに何を入れていいのかわかりません
C#もやってますがどちらにしろ初心者でわかりませんし・・・

394:デフォルトの名無しさん
11/10/29 10:15:21.39
配列を作ったら次は各要素にToolStripItemのインスタンスを代入する
C#の入門書買って出直してきたら

395:デフォルトの名無しさん
11/10/29 16:39:02.97
for i=0 < .. <i++
IntPtr ptr(hoge[i]);
strips[i] = (gcnew System::Windows::Forms::ToolStripMenuItem());
strips[i]->Text = System::Runtime::InteropServices::Marshal::PtrToStringAnsi(ptr);}

hoge[i]はhoge[5][20]のWCHARです
先頭の一文字しかTextに入っていません。どうすれば良いでしょうか?

396:デフォルトの名無しさん
11/10/29 16:58:16.15
> Marshal.PtrToStringAnsi メソッド
> アンマネージ ANSI 文字列から最初の null 文字に遭遇するまでのすべての文字をマネージ String にコピーし、
> 各 ANSI 文字を Unicode に拡張します。
何故、WCHAR*を入れられると思ったのだろうか

URLリンク(msdn.microsoft.com)

397:デフォルトの名無しさん
11/10/29 17:13:28.22
>>396
>アンマネージ ANSI 文字列から最初の null 文字に遭遇するまでのすべての文字をマネージ String にコピーし、
> 各 ANSI 文字を Unicode に拡張します。
どの部分がcharって意味なんですか?
ちなみにsize_t wLen = 0;errno_t err = 0;/*ロケール指定*/setlocale(LC_ALL,"japanese");/*変換*/err = wcstombs_s(&wLen, wStrC, 20, charmoji, _TRUNCATE);で直したらできました


398:デフォルトの名無しさん
11/10/29 18:45:00.94
array<System::Windows::Forms::ToolStripMenuItem^>^ strips = gcnew array<System::Windows::Forms::StripMenuItem^>(5);
のstripsをフォームいじっても消えないところでグローバル宣言したいのですがどうすれば良いでしょうか?

399:デフォルトの名無しさん
11/10/29 19:27:05.70
>>397
ANSI 文字列って書いてるんだから違うものを入れるなよ

しかも、文字列のマーシャリングとか>>397のリンク先を見れば一発で解決するような超FAQだから、
そんな無駄なコードなんか貼らなくていいよ

400:デフォルトの名無しさん
11/10/30 00:13:45.13
>>398
クラス直下に書いとけば

そんなレベルで試行錯誤してても時間の無駄だよ
悪いことは言わないからちゃんと1から言語を勉強してきたほうがいい(C#かCLIじゃない方のC++を)

401:デフォルトの名無しさん
11/10/30 00:22:47.79
arrayの内1つを消して間を詰めるにはどうしたら良いですか?

402:デフォルトの名無しさん
11/10/30 00:25:17.38
無理。新しい配列を作ってコピーする。

403:デフォルトの名無しさん
11/10/30 00:32:43.14
arrayって使わない方が良いんですか?
vectorとかの方が良いんですか?

404:デフォルトの名無しさん
11/10/30 00:35:25.75
.NETが絡むところでvectorは使うな
動的に要素数を変えたいならSystem::Collection::Generic::List<T>を使う
もういいからC#やれ

405:デフォルトの名無しさん
11/10/30 00:36:42.68
じゃあ最後にC++/CLIのメリットを教えてください

406:デフォルトの名無しさん
11/10/30 00:38:40.01
マゾ御用達

407:デフォルトの名無しさん
11/10/30 00:53:12.14
キモかわいい
array<Hoge^>^%はC#だとref Hoge[]で味気ない

408:デフォルトの名無しさん
11/10/30 21:28:13.45
for(int i=1;i<5;i++){this->textBox1->Text += (i + ". \n");}
改行しません。どうしてでしょうか?


409:デフォルトの名無しさん
11/10/30 21:39:23.47
\r\nと書かないといけないのですね
ありがとうございました

410:デフォルトの名無しさん
11/10/31 01:30:07.13
WCHAR *g; *g= this->textBox1->Text->ToCharArray()[0] ;
コンパイルは通るし画面のテキストボックスにも文字はちゃんと表示されてるのに
オブジェクト参照がオブジェクト インスタンスに設定されていません とエラーが出て止まります。どうすれば良いですか?

411:デフォルトの名無しさん
11/10/31 02:45:15.47
ぬるぽ

412:デフォルトの名無しさん
11/10/31 02:53:26.62
ちょwwぬるぽじゃなくて教えれwww

413:デフォルトの名無しさん
11/10/31 06:25:43.59
ここまであからさまなぬるぽはないわ

414:デフォルトの名無しさん
11/10/31 06:27:02.15
逝ってよし

415:デフォルトの名無しさん
11/10/31 08:46:35.87
まぁ、pin_ptr が何のためにあるのか、という話だな

416:デフォルトの名無しさん
11/10/31 23:46:48.11
C++/CLIのプロジェクトに
C#のソースも追加出来ますが(Prof以上のみ?)、
C++/CLIからそのC#のクラスを使えますか?
C#からC++/CLIのクラスは使えるようですが・・・

417:デフォルトの名無しさん
11/11/01 00:03:00.11
C#のソースは知らんが、C++/CLIから.netのクラスやら機能を使うのは.netの機能使うのと同じ

418:デフォルトの名無しさん
11/11/01 00:03:25.92
プロジェクトに追加するだけなら自由だが。
混ぜてコンパイルは無理。
dllを参照して使用するのは相互に可能。

419:デフォルトの名無しさん
11/11/01 00:35:20.55
やっぱ使えませんか
大人しくプロジェクト分けるしかないのですね・・・

420:デフォルトの名無しさん
11/11/06 15:39:11.10
アプリ起動中にpictureBox内に矩形を表示させておきたいのですが
どこにコードを書けばいいですか?
pictureBox_Paint内だと起動直後の一瞬しか表示されません

421:デフォルトの名無しさん
11/11/06 15:50:26.29
大方CreateGraphicsとか使ってるんじゃね

422:デフォルトの名無しさん
11/11/06 16:39:49.74
その通りでした。ご指摘ありがとうございました

423:デフォルトの名無しさん
11/11/09 16:12:12.50
インテリセンスマダー?

424:デフォルトの名無しさん
11/11/10 07:34:24.84
質問です。
ネイティブ(アンマネージド)なC++の静的ライブラリを
C++/CLIでリンクして使うと変な所で死んだりするんだけど、
こういう事しちゃだめなのでしょうか?
一旦ネイティブなDLLを作って、そこを介して呼べば死なないのですが・・・。

そのライブラリは実装を隠蔽するため
クラスのインタフェース部分のみ公開して、
インスタンスの生成と開放を関数化してあるのですが、
つまりはnew/deleteがライブラリ内で実行され、
ライブラリ内でnewした結果を返し、マネージドコード内で保持し、
そのポインタをライブラリに渡してdeleteしてもらう形になっています。

よく分からないのは、わざとnewをせずポインタをNULLで初期化したままにしておき、
「NULLでなければ開放関数を呼ぶ」というコードを書いただけでも、
そこで死んでしまうのです。(NULLなので開放関数は呼ばれない!)
vectorヘッダをインクルードするかしないかで、死んだり死ななかったりと、
挙動がおかしすぎて正直よく分からない状況です。

425:デフォルトの名無しさん
11/11/10 16:05:38.55
ファイナライザが別スレッドから呼ばれるからとかじゃない

426:デフォルトの名無しさん
11/11/12 18:54:13.34
using使ってるのでそこは大丈夫だと思います

427:デフォルトの名無しさん
11/11/12 23:05:46.09
(gcnew Form1)->Show();
で作成されたフォームに
元のフォームにある文字列変数を渡す方法があったら教えてください

428:デフォルトの名無しさん
11/11/12 23:10:34.52
コンストラクタの引数で渡すかプロパティ定義して渡す
つかそれだとC#もC++もさっぱりだよね? ならまだ遅くないから今すぐC#に乗り換えること。

429:デフォルトの名無しさん
11/11/13 20:42:15.74
FindWindow で探すとか、EnumWindow でタイトルを調べるとか?

430:デフォルトの名無しさん
11/11/13 21:12:34.82
Showする前に渡せば良い

431:デフォルトの名無しさん
11/11/13 21:53:59.80
同じアプリ内でしかも.NETのフォームでFindWindow/EnumWindowとかアホか

432:デフォルトの名無しさん
11/11/17 00:53:02.53
オブジェクトとメンバ関数名を与えられたときに、その関数を呼び出すことはリフレクションを介して簡単にできますが、
指定された名前のグローバル関数を呼び出すことは可能ですか?

433:デフォルトの名無しさん
11/11/17 01:19:51.91
.NETでグローバル関数なんて使うもんじゃない
クラスの静的メンバにする

434:デフォルトの名無しさん
11/11/17 01:37:36.37
ですよねー。

435:デフォルトの名無しさん
11/11/17 14:05:35.23
グローバル関数なんて無かったんや!

436:デフォルトの名無しさん
11/11/23 22:13:47.85
自作したグローバル関数を書くのはどこが一番よろしいですか?
プロジェクト全体でつかうような関数です。
stdafx.hに書いたら

error LNK2005: "int __clrcall testfunc(void)" (?testfunc@@$$FYMHXZ) は既に stdafx.obj で定義されています。

ってエラーが出るのですが( ;∀;)

437:デフォルトの名無しさん
11/11/23 23:10:37.60
そらそうだろ
C++/CLIというか、C++の基本から勉強し直してこい

438:デフォルトの名無しさん
11/12/07 06:58:01.68
インクルードガード

439:デフォルトの名無しさん
11/12/07 07:29:07.57
関数にstaticかinlineつけて内部結合にするがよろし

440:デフォルトの名無しさん
11/12/07 15:36:45.42
ガードしても意味無いだろ。
別々のソースでインクルードされてコンパイルして、
それらをリンクしたら同じ名前の関数が複数出来上がってるわけだし。

と、ついでに質問者に説明してみる

441:デフォルトの名無しさん
11/12/07 18:59:29.54
>>440
スマヌ

442:デフォルトの名無しさん
11/12/12 18:04:16.59
あるサイトを参考にUnicodeからshift_jisに代えようとしてるんですが以下のコードで
cli::array<unsigned char^>^ ToShiftJis(System::String ^ unicodeStrings)
{
System::Text::Encoding^ unicode = System::Text::Encoding::GetEncoding(1200);
cli::array<unsigned char>^ unicodeByte = unicode->GetBytes(unicodeStrings);
System::Text::Encoding^ s_jis = System::Text::Encoding::GetEncoding(0);
cli::array<unsigned char>^ s_jisByte = System::Text::Encoding::Convert(unicode,s_jis,unicodeByte);
cli::array<unsigned char^>^ s_jisChars = gcnew cli::array<unsigned char^>(s_jis->GetCharCount(s_jisByte,0,s_jisByte->Length));
s_jis->GetChars(s_jisByte,0,s_jisByte->Length,s_jisChars,0);
return s_jisChars;

}
をビルドすると
error C2664: 'int System::Text::Encoding::GetChars(cli::array<Type> ^,int,int,cli::array<wchar_t,dimension> ^,int)' : 4 番目の引数を 'cli::array<Type> ^' から 'cli::array<Type,dimension> ^' に変換できません。
とエラーが出るのですが、どうすればよいのでしょう
どなたかご教示ください。


443:デフォルトの名無しさん
11/12/12 21:18:25.11
MFC の CString 使ったら?

444:デフォルトの名無しさん
11/12/13 04:07:52.11
Encoding.GetChars()ってChar[]とるんじゃないのか?
関係ない型をボックス化して何がしたいの?
というか、Encoding.Convert()の時点で既にSJISになっているし

445:デフォルトの名無しさん
11/12/13 13:58:16.46
Hoge hoge[x];
の要素数はsizeof(hoge)/sizeof(hoge[0])で取得できますが
Hoge *hoge=new Hoge[x];
の要素数はどうやって取得すればいいですか?

446:デフォルトの名無しさん
11/12/13 17:05:42.47
>>442
unsigned charに ^ は要らないと思うが

447:デフォルトの名無しさん
11/12/13 20:58:34.89
>>445
ネイティブ配列のサイズは自分で変数や定数で覚えとくのが基本
というかC++/CLI関係ないだろ

448:デフォルトの名無しさん
12/01/13 18:39:32.59
System::Stringからchar*に変換する関数を書きました。
半角256文字以上のテキストを投げると、255文字+\0でめられてしまいます。
下記をどのように修正すればいいでしょうか?

#include <msclr/marshal.h>
inline char* toPtChar(const String^ Text)
{
String^ temp = (String^)Text;
msclr::interop::marshal_context^ context = gcnew msclr::interop::marshal_context();
return (char*)(context->marshal_as<const char*>(temp));
}


449:448
12/01/13 18:45:03.89
>半角256文字以上のテキストを投げると、255文字+\0でめられてしまいます。

半角256文字以上の文字列を投げると、255文字+\0で丸められてしまいます。
2000文字程度変換できれば良いのですが、

の間違いです。すみません。

450:448
12/01/13 19:43:34.29
関数を以下のように書き換えてSystem::String→char*しても、
やはり256文字以上は消えてしまいます。
関数ではなく、何か他に原因があるんでしょうか?

#include <msclr/marshal.h>
using namespace msclr::interop;
using namespace System::Runtime::InteropServices;
char* toPtChar(const String^ Text)
{
String^ foo = (String^)Text;
IntPtr ptr = Marshal::StringToHGlobalAnsi(foo);
return (char*)ptr.ToPointer();
}
URLリンク(is.gd)


451:デフォルトの名無しさん
12/01/16 10:35:10.44
URLリンク(www.cetix.de)
これか?
試してないけど。

452:デフォルトの名無しさん
12/01/18 17:31:31.29
   ◢▀▅     ▃
     ▋    ▋  ◢▀ ▀◣
    ▌     ▌ ▌     ▌
     ▌    ▌ ▌    ▌
    ▐      ▌ ▌     ▌
     ▐     ▀■     ▌
   ◢◤         ▀▃
  ◢◤             ◥◣
  ▌              ▌
 ▐   ●       ●    ▌      馬鹿にはコピペできないの。
  ▌              ▌
  ◥◣      ╳       ◢◤
   ◢▀▅▃▂   ▂▂▃▅▀▅
 ◢◤    ▀▀▀▀▀     ◥◣
▐◣▃▌           ▐▃◢▌
◥◣▃▌            ▐▃◢◤
  ▀▅▃          ▂▅▀
     ▀■▆▅▅▅▆■█▀
     ▐▃▃▃▲▃▃▃◢▍

453:デフォルトの名無しさん
12/01/18 17:32:09.47
   ◢▀▅     ▃
     ▋    ▋  ◢▀ ▀◣
    ▌     ▌ ▌     ▌
     ▌    ▌ ▌    ▌
    ▐      ▌ ▌     ▌
     ▐     ▀■     ▌
   ◢◤         ▀▃
  ◢◤             ◥◣
  ▌              ▌
 ▐   ●       ●    ▌      馬鹿にはコピペできないの。
  ▌              ▌
  ◥◣      ╳       ◢◤
   ◢▀▅▃▂   ▂▂▃▅▀▅
 ◢◤    ▀▀▀▀▀     ◥◣
▐◣▃▌           ▐▃◢▌
◥◣▃▌            ▐▃◢◤
  ▀▅▃          ▂▅▀
     ▀■▆▅▅▅▆■█▀
     ▐▃▃▃▲▃▃▃◢▍

454:デフォルトの名無しさん
12/01/18 18:05:42.86
日本の国民の中には、外国の事情がある程度分かっている人を除けば、
放送内容を信頼している人がまだいることは確かだ。一方で、ネット
住民たちのほぼ全員が、放送番組には政府の意図が色濃く反映されて
いることを知っている。自分の国がどういう国かということが、よく
分かるようになってきているのだ。

455:デフォルトの名無しさん
12/01/20 23:34:30.86
失礼します。色々まわっていたのですが此方を勧められたので此方でも質問させて頂きます。

VC++でWindowsフォームのプログラムを組んでいるのですが、
別ファイルでextern宣言したクラス(の配列)をform1.h等で参照したいのですがコンストラクタが上手く働いてくれないのか、宣言の場所が悪いのか
ゴミ値ばかりで上手く動作してくれません。
何かヒントもらえませんか?

456:デフォルトの名無しさん
12/01/21 02:53:36.13
ソース貼るか
エラー貼るか
何かヒントもらえませんか?

457:デフォルトの名無しさん
12/01/21 23:51:21.19
いきなりcharではなくwchar_tに変換
でWinAPI使ってcharに

458:デフォルトの名無しさん
12/01/22 11:17:33.74
>>455
コードも何も書かれてないから憶測でしかないが、newとgc_newを使い分けてないとか、*と^を使い分けてないとか、その辺じゃない?
後は配列が.netのクラスをちゃんと継承してないとか
生のC++とC++/CLIは全くと言って良いほど別言語で、でも生のC++も使えちゃうからC#とC++の合わせ技より罠が多く、バグが多くなり易いよ



459:デフォルトの名無しさん
12/01/23 11:32:22.34
publicにしてないとか

460:デフォルトの名無しさん
12/01/23 12:35:15.69
dll が違うとか

461:デフォルトの名無しさん
12/02/21 23:29:28.14
VC++のプロジェクトのwindowsフォームアプリでOpenMPって使えないんですかね?
'/clr:pure' と '/openmp' は同時に指定できません
ってエラーが出てるんで、CLIでは使えないのかな?とか思ったりしたんですがどうでしょう

462:デフォルトの名無しさん
12/02/21 23:38:46.12
/clr:pureで使えるわけがないだろネイティブコード入れられないんだから
/clrならどう?
っていうかWindowsフォーム使いたいだけだったら終わってるC++/CLIなんてやめて
C#でGUI作って重い計算だけC++(/CLIでない)で書いてC#から呼んだほうがいいよ

463:デフォルトの名無しさん
12/02/24 20:06:17.85
>>461 です
/clrならできました。ありがとうございます。
よくわかっていないのですが、/clr:pureにしていたのはネイティブとごっちゃになって
変なことになるのを防ぐためなんですかね?だから/clrとしてもそこらへんを気をつければ
問題ない、ということでいいんでしょうか?
C++/CLIは初めてなんで、どう”終わってる”のかわかりませんが、C#はやったことが無いので、
できればこっちでやりたいところなんです。

464:デフォルトの名無しさん
12/02/24 20:20:54.26
大丈夫だ、C++経験者からしてもC++/CLIの習得よりC#の習得の方が楽だから

465:デフォルトの名無しさん
12/02/24 20:21:49.18
/clr:pureだとアセンブリにネイティブコードが混ざらない。
ネイティブコードを混ぜないC++/CLIなんて存在価値ゼロだから、C++/CLI使うんなら常に/clrでおk。
C#をやれ。いくらC++の経験があろうが関係ない。間違いなくC#の方が早く使えるようになるし
開発効率に天と地ほどの差がある。C++/CLIはMSに完全に見捨てられている技術。

466:デフォルトの名無しさん
12/02/24 20:25:20.13
VS2010ではもうインテリセンスすら付けてくれてないもんね

467:デフォルトの名無しさん
12/02/24 21:09:13.08
C#やってみます。
過去のレス見てきたんですけど、ひどい言われようですね
あと、あんま書き込み無いのにレスは早くて面白かったです。

468:デフォルトの名無しさん
12/02/27 08:13:52.05
いろいろと屈折した愛があるからなw

469:デフォルトの名無しさん
12/02/29 02:03:40.75
俺はこのスレに張り付いてるけど一応ちょっと待ってからレスしてるわ

470:デフォルトの名無しさん
12/03/02 07:33:50.86
呼び出し規約がよくわからないのですが、関数を宣言した場所で明示しない場合
・引数・返り値の型にマネージ型が含まれる→__clrcall になる
・含まれない→__stdcall になる。実装がマネージドコードにコンパイルされると、double-thunkingになる
という理解であっているでしょうか。

また、非マネージ型のメンバ関数においては、
managed-code -> __thiscall stub -> __clrcall のような double-thunking が発生するのでしょうか?

471:デフォルトの名無しさん
12/03/07 16:17:15.87
VS11βでもインテリセンス無いかな?

472:デフォルトの名無しさん
12/03/08 00:59:01.93
今ちょっと打ってみたが効くみたいだよ。

473:デフォルトの名無しさん
12/03/13 21:11:04.75
C1001 が出た。
みんな報告してる?

474:デフォルトの名無しさん
12/03/14 04:07:10.11
可能な限りする

475:デフォルトの名無しさん
12/03/14 11:15:03.77
やっぱそうだよな。VS11Betaで試してconnect行くわ。

476:デフォルトの名無しさん
12/03/15 09:53:47.89
VS11betaでもやっぱりIntellisSense効かなくて
"No additional information available"って言われるんだけど
何が悪いんだろう

ButtonとTextBox置いてButtonのイベントハンドラの中で
textBox1->とかやってるだけなんだけど
最初のt打っただけで上のエラーが出て
->まで打ってもエラー出たままでメンバも表示されない

477:デフォルトの名無しさん
12/03/15 20:40:01.46
URLリンク(homepage3.nifty.com)
ここの一番下の図5は図6用の計算式はどの様に記入すれば良いのですか。

478:デフォルトの名無しさん
12/03/16 10:49:25.88
function1のとこだろ
どう考えてもC++/CLIでやるべきことじゃないよなこれ
内容は凄いのに…C#にすれば…

479:デフォルトの名無しさん
12/03/18 11:04:51.87
おお、派手だなw
.net framework 使いたいだけならC#でいいなーほんとに

480:デフォルトの名無しさん
12/03/18 12:14:54.13
eのこと聞いてんのかな?
Math::Exp() にすりゃいいと思うが、、、、

481:デフォルトの名無しさん
12/03/20 20:55:02.08
こういう変に優秀な勘違いがいるからC++/CLIに手を出す奴がいなくならないんだよな
C++/CLIの記事や書籍ってC#やVBに比べて妙に良質だったりするし

482:デフォルトの名無しさん
12/03/21 00:15:02.30
C/C++では配列の終端の一つ次を指すポインタは有効なポインタだったのですけど、
マネージ配列の終端の一つ次を指す interior_ptr は配列がGCで移動したときに正常に更新されますか?

483:482
12/03/25 13:00:47.00
いまさらですが、試してみたところ正常に移動するようでした。

484:482
12/03/26 18:19:27.80
(勝手な推測ですが) interior_ptr はハンドルとオフセットのペアで実装されているのではないかと思います。

array<int> ^a;
auto pa = &a[3]; // { a, 12 }

int *p;
interior_ptr<int> ip (p); // { nullptr, p }

ところで、長さ 0 の配列 (b) に対して &b[0] は IndexOutOfRangeException なんですね…。困った困った。

485:デフォルトの名無しさん
12/03/26 21:59:14.05
配列でinterior_ptrなんて必要?
君が言ってるように常に配列のハンドルとオフセットをペアにしとけばよくね
interior_ptrってクラスのインスタンスフィールド指すのに使うやつでしょ

486:デフォルトの名無しさん
12/03/27 07:37:57.33
既存コードの一部だけマネージに持っていく実験なので。
*& はできても interior_ptr<T>% はできないので、配列 + オフセットの方が便利なのはその通りです。


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch