くだすれC++/CLI(初心者用)part2

レス数が950を超えています。1000を超えると書き込みができなくなります。
1./1256645713/6622010/03/15(月) 09:41:19
おそらく、.NET開発でデファクトスタンダードに最も近いであろう
C++/CLIについて語ろうぜ!

このスレはC++および.NET Frameworkについて一定以上の知識を持っている人が対象となります。
.NETのクラスライブラリの使い方といった質問は Visual Studioスレにお願いします。

前スレッドはこちら
くだすれC++/CLI(初心者用)
http://pc8.2ch.net/test/read.cgi/tech/1142144110/l1

dat落ち姉妹スレ
C++/CLI part3
http://pc12.2ch.net/test/read.cgi/tech/1206447234/l1
http://pc11.2ch.net/test/read.cgi/tech/1142147319/l1
http://pc8.2ch.net/test/read.cgi/tech/1126450441/l1

managed C++ やろうぜ!! 002
http://pc8.2ch.net/test/read.cgi/tech/1139043535/l1

2./1256645713/6622010/03/15(月) 09:45:45
ドキュメントの MSDN には、System::String(SByte*); て書いてあるけども、
System::String(char*); が正解ってことか?

それとも SByte が signed char ではなくて char てこと?それは無いような気が。

ちなみに、使ってる教科書のサンプルプログラムは8bitでは char* 配列を渡してる。

3デフォルトの名無しさん2010/03/17(水) 19:44:10
厳密名の付け方が分かりません
検索しても意味不明なものしか引っかからない

4デフォルトの名無しさん2010/03/17(水) 21:02:17
開発でつかわれてるのかな?
C++/CLIって。

5デフォルトの名無しさん2010/03/17(水) 21:41:39
必要なら使われるだろ。
だからなんなんだ?

6デフォルトの名無しさん2010/03/17(水) 22:37:29
>>3
LINKにある。
/KEYCONTAINER /KEYFILE

7デフォルトの名無しさん2010/03/17(水) 22:45:13
というか必要な時だけ最小限使うもの
基本的に使わないほうがいい

8デフォルトの名無しさん2010/03/18(木) 00:33:17
最近妙にお気に入り

9デフォルトの名無しさん2010/03/18(木) 09:03:31
Managed C++でさえ一部で使われていた。

10デフォルトの名無しさん2010/03/22(月) 19:23:41
フォームの中にあるテキストボックスの内容をmainとか関数とかから書き換えたいんだけど
どんな方法があるでしょうか?
今までは強引にチェックボックスにチェックが入ると
void test(System::Windows::Forms::TextBox^ tb_log_view);
こんな感じの関数呼び出してTextBoxを強引にわたして指定の処理して
テキストボックスにメッセージ表示させてたんだけど
何せ使い勝手が悪いので・・・

11デフォルトの名無しさん2010/03/25(木) 01:29:18
String^使えばいいんちゃう?

12デフォルトの名無しさん2010/03/25(木) 18:00:01
今、「Cで書かれたライブラリをC++/CLIでラッピング(DLL化)し、
C#で使おう」という目的に向けて、Cのライブラリをラッピング中ですなのですが、構造体で悩んでます。
C++/CLI側でC#側に「構造体の配列」を返す関数が見せてるのですが、実行すると思ったように動きません。

C++/CLI側
[宣言]
public ref struct SampleStruct {
  static CHAR cUpdate;
};
static array<SampleStruct^>^ pstSample = gcnew array<SampleStruct^>(10);

関数
array<SampleStruct^>^ hogehoge(){
  if(pstSample[0] == nullptr ){
    for(int i=0; i<10; i++ ){
      pstSample[i] = gcnew (SampleStruct);
    }
  }
  pstSample[2]->cUpdate = 2;
  return pstSample;
}

C#側
SampleStruct[] stTest = new SampleStruct[10];
stTest = LIBSAMPLE.hogehoge();

ここで、stTest[0].cUpdateからstTest[9].cUpdateまでを見ると
全部2が入っております。(本当は[2].cUpdateだけ2が入っていて欲しい)
どこが原因か分かりますでしょうか?
OS:XP
環境:VS2008 ExpressのC++版とC#版を使ってます。

13デフォルトの名無しさん2010/03/25(木) 18:34:20
>  static CHAR cUpdate; 
Cさえ理解していないのがよくわかる。

14デフォルトの名無しさん2010/03/25(木) 18:45:45
うわ・・・・・
泣ける・・・・orz

回答有難うです

15デフォルトの名無しさん2010/03/25(木) 18:53:51
突っ込みどころや怪しい箇所が多すぎて、どうしたいかが見えてこない(笑
配列はC++/CLIでアロケーションしていいのかとか。
C#でいう構造体はvalue class (or struct)であって、ref structはクラスだけどどっちにしたいのとか。

1612,142010/03/25(木) 19:13:48
目的は、「Cで書かれたライブラリをC#で使う」事なのですが、
現状は、Cの方には手を加えないように、やる方法として、C++/CLIで
ラッピングするという手段があるという事なので、作業している次第。

そこで、構造体のポインタを戻り値としている関数はどう扱えば?と
思ってましたら、
http://ap.atmarkit.co.jp/bbs/core/fdotnet/17380
このような話をみつけたので、まずはref structでやってるという状況です。

17デフォルトの名無しさん2010/03/25(木) 20:50:34
CのライブラリだったらC++/CLIなんか使わずにC#でDllImportすればいいような

1812,142010/03/26(金) 09:55:14
>>17
説明不足でした。
(当然の疑問ですよね)

そのCのライブラリというのが、元がスタティックしか考慮されておらず、
DLL用にはなってなく(__declspec(dllexport)のような記載は一切なし)、
選択肢として
1 Cのソースをdll対応に修正(__declspecを全関数に追加)
2 元のCには手を加えず、新しくラッパーを作る

があり、今後もCの方は勝手にバージョンが上がっていくので、
それなら、元のソースに手を加えない方向でやろうとなった次第です。

19デフォルトの名無しさん2010/03/26(金) 10:26:08
だからってそのラッパーをC++/CLIで書く必要はないだろ
Cで薄ーいラッパー書いて普通のネイティブDLLとしてコンパイルすればおk
C++のライブラリとなると面倒だけどそうでないならC++/CLIはできるだけ避けたほうが賢明

2012,142010/03/26(金) 12:05:28
>>19
その手がありましたか!
C#でDllImportして、
DLL関数に渡す構造体、DLL関数から受け取る構造体は
[StructLayout(LayoutKind.Sequential)]を用いてC#側に定義して
やりとりするという事ですね。

試してみます

21デフォルトの名無しさん2010/04/25(日) 20:06:11
【初心者歓迎】C/C++室 から誘導されてきました。

Form1とForm2があり、Form1からForm2を呼び出すようにしています。
また、Form2に配置したボタンを押すと関数が呼び出されて、所望の処理をするようにしています。
以下の2点について教えてください。

1.関数内の処理の進捗をForm2内のLabelやProgressBarに表示したいです。
2.Form2からForm1を操作したい(Form2のボタンを押すとForm1/Form2ともに終了するようにしたい)です。

両方ともポインタを使えば出来そうな気がするのですが、例えば2.の方ではForm2を指すポインタの宣言の仕方が
わからないです。

よろしくお願いします。

22デフォルトの名無しさん2010/04/25(日) 20:24:49
>>21
ポインタじゃなくて参照になる。
Form2^ form2;

23デフォルトの名無しさん2010/04/25(日) 20:26:28
>>21
動くかどうかは試してない。

【Form1.h】
ref class Form1 {
public: System::Void Form1Func() {〜}
private: System::Void Form2Func();
private: System::Void Form1_KeyDown(〜) {Form2Func();}
}
【Form1.cpp】
#include "Form1.h"
#include "Form2.h"
System::Void Form1::Form2Func(){
Form2^ form2 = safe_cast<Form2^>(Application::OpenForms["Form2"]);
form2->Form2Func();
}
【Form2.h】
ref class Form2 {
public: System::Void Form2Func() {〜}
private: System::Void Form1Func();
private: System::Void Form2_KeyDown(〜) {Form1Func();}
}
【Form2.cpp】
#include "Form1.h"
#include "Form2.h"
System::Void Form2::Form1Func()
{
Form1^ form1 = safe_cast<Form1^>(Application::OpenForms["Form1"]);
form1->Form1Func();
}

24212010/04/25(日) 23:09:54
>>22>>23
ありがとうございます。
残念ながらうまくいかないです。

環境はVS2005 C++ WinXP SP3
Form1(親フォーム)からはForm2.hをインクルードして
Form2^ frm = gcnew Form2();
frm->ShowDialog();
とできるのですが、Form.hではForm1.hをインクルードすると循環参照になってしまうようでエラーになります。
また、Form2.h内で関数宣言だけしてForm2.cpp内でForm1.hをインクルードして実行部分を書こうとしましたが
Form2.h内の関数宣言(>>23のprivate: System::Void Form1Func();にあたる部分)がコンパイルエラーになってしまいます。


25デフォルトの名無しさん2010/04/27(火) 01:31:54
なんでこういう意味での初心者がC++/CLIなんてマニアックな言語触ってるんだろう……?

> Form2に配置したボタンを押すと関数が呼び出されて
> 1.関数内の処理の進捗をForm2内のLabelやProgressBarに表示したいです。
Form1関係ないよね? Form2が勝手にやってろって話

> 2.Form2からForm1を操作したい(Form2のボタンを押すとForm1/Form2ともに終了するようにしたい)です。
Form1がForm2を作ったとき、Form2のFormClosedイベントに引っかけるとかすればいいんじゃね?

// Form1内のForm2を表示させる処理
Form2^ form = gcnew Form2();
form->FormClosed += gcnew FormClosedEventHandler(this, &Form1::OnForm2Closed);
form->Show();

// Form1内で定義
private: void OnForm2Closed(Object^ sender, FormClosedEventArgs^ e) {
  this->Close();
}

×アイコンで閉じたときはForm1は閉じない、ボタン押したときだけとかなら
Form2にCloseWithParentみたいなプロパティ用意して
表示させるときのForm2^はメンバ変数に保持しておいて
OnForm2Closedで確認

26デフォルトの名無しさん2010/06/07(月) 09:58:49
C++/CLIだと、Cのランタイム例外のハンドリングが出来ない臭いんだけど、どうすれば良いんだろう…
ハンドラ設定してるのに動いてくれない
例えば_tcsftime(..., L"%h", ...);みたいなやつ

※普通の例外じゃないんで、マネージand/orネイティブでもtry catch出来ない

27デフォルトの名無しさん2010/06/09(水) 20:43:17
そもそもCRTが例外なんて投げないはずだが

> 727 :デフォルトの名無しさん[sage]:2008/07/03(木) 13:51:22
>     なんで、VC++2008の、strftime _tcsftimeは、
>     書式に無い文字を渡すと例外終了するのかなあ。
>    単に無視してくれりゃいいのに。
>    自前でパースしてから、渡してやるしか無いのかな。
> 729 :デフォルトの名無しさん[sage]:2008/07/03(木) 14:11:02
>     ちょっと見てみたけど
>     _ASSERTE( ( "Invalid format directive" , 0 ) );
>     だからデバッグ時だけの話じゃん。

28デフォルトの名無しさん2010/06/10(木) 10:35:20
>>27
http://msdn.microsoft.com/ja-jp/library/ksazx244(v=VS.80).aspx

試してみると早いかも…

int main(array<System::String ^> ^args)
{
Console::WriteLine(L"Hello World");
tm tmNow;
__time64_t tNow;
TCHAR sz[20];
try
{
_time64(&tNow);
_localtime64_s(&tmNow, &tNow);
_tcsftime(sz, 20, L"%h", &tmNow);
}
catch (...)
{
Console::WriteLine("error!");
}
Console::ReadLine();

return 0;
}

29デフォルトの名無しさん2010/06/10(木) 13:07:44
ハンドラ設定ってなんだ普通に_set_invalid_parameter_handlerで呼んでくれたが

30デフォルトの名無しさん2010/06/14(月) 22:16:23
SerialPortクラスを使ってデータを受信する際、
・SerialPort::Data_Receivedイベントで受信
・受信データはQueueクラス経由でメインスレッドから受信
・メインスレッドでは、あるバイト数を数秒以内に受信できない場合タイムアウト
を、実装したいのですが、タイムアウト処理はどのように記述したら良いのでしょうか?

// Data_Receivedイベント
private: System::Void serialPort_DataReceived(System::Object^ sender, System::IO::Ports::SerialDataReceivedEventArgs^ e)
{
int length = serialPort->BytesToRead;

array<unsigned char>^ buffer = gcnew array<unsigned char>(length);

serialPort->Read(buffer, 0, length);

Queue^ sync_queue = Queue::Synchronized(m_queue);

for (int i = 0; i < length; i++)
{
sync_queue->Enqueue(buffer[i]);
}
}

31デフォルトの名無しさん2010/06/26(土) 12:09:02
マネージクラスのインスタンスをグローバルスコープっぽく参照する方法ないの?
全コンストラクタでやりとりするようなマンドクセ方法がいやだ

32デフォルトの名無しさん2010/06/26(土) 15:55:49
クラスの静的メンバに入れとけばいいだけ

33デフォルトの名無しさん2010/06/27(日) 16:28:42
あと public static ね

34デフォルトの名無しさん2010/08/05(木) 23:46:40
C++/CLIに書き換えてる奇特なものです

char www[100];
char* ptr;
ptr = www + i;

array<char>^ www = gcnew array<char>(100);
array<char>^ ptr;
ptr = www + i; ← ?

?の部分をご教授くださいm(_ _)m

35デフォルトの名無しさん2010/08/06(金) 00:53:22
CLI配列はポインタじゃないから無理

36デフォルトの名無しさん2010/08/06(金) 10:21:40
pin_ptr してもいいけどさ、www[i] で駄目な理由は何なの?

37デフォルトの名無しさん2010/08/07(土) 08:14:59
C++の感覚なら毎回[i+a]としないで最初からオフセット付けときたいのは当然だろ
無理なので常にwwwとiをセットにして持ちまわるのが普通
メソッドの引数にもオフセットを指定できるようにする

38デフォルトの名無しさん2010/08/07(土) 22:43:16
perlのように return a, b できるようにしてくんないかな


39デフォルトの名無しさん2010/08/08(日) 12:07:55
.NET4ではTuple型自体は導入されたのでC#やVBでは将来的に
言語レベルでサポートされる可能性はある。
C++/CLIはほぼ見捨てられてるので期待するだけ無駄。

40デフォルトの名無しさん2010/08/17(火) 21:49:08
>>34
array<char>^ www = gcnew array<char>(100);
interior_ptr<char> ptr;
ptr = &www[0] + i;

41デフォルトの名無しさん2010/08/21(土) 06:53:22
VC2010 EEを使用しています。

RS-232Cで通信を行い、プログラムを終了させようとして
this->Close();
を行うと、エラーメッセージも出ないままプログラムが固まってしまいます。

ポートを閉じてないことが原因かと思い、
serialPort1->Close();
を実行してみたところ、今度はここで同じように固まってしまいました。

http://vsug.jp/tabid/63/forumid/46/postid/9991/scope/posts/Default.aspx
を、参考に、BeginInvokeを使用していますが、ダメでした。

この場合、どこを見れば良いのでしょうか?
よろしくお願いします。

42デフォルトの名無しさん2010/09/18(土) 16:16:15
画像処理を行いたいのですが、
Bitmap、Image、Graphic・・・どのコンポーネントを使うのがお得なのでしょうか

43デフォルトの名無しさん2010/09/18(土) 16:36:42
>>42
どんな画像処理をするかが分からないと、
えらべないと思われます

44422010/09/18(土) 16:48:33
カラー画像をモノクロにしたり、コントラストかけたり、拡大縮小したりの初歩的なことがしたいです。
あと、今のところはCUIで行いたいです。

45デフォルトの名無しさん2010/09/18(土) 18:01:22
>>44
俺はあまり詳しくないが、
ぐぐると
ttp://msdn.microsoft.com/ja-jp/academic/cc998604.aspx
ここで
Bitmap クラスを利用することにより、画像に対してピクセル単位で様々な処理を行うことができます
と書いてある
.netのクラスを使うなら、おそらくやりたいことはこういうことだろう

46デフォルトの名無しさん2010/09/18(土) 23:40:29
Bitmap使ってみたけれど、画像の保存の仕方がわからない・・・
WriteBitmap("C:\\・・・",data)とかdata.Save(・・・)ってな感じでできないのかな

47デフォルトの名無しさん2010/09/18(土) 23:43:33
普通にSaveメソッドあるだろ

48デフォルトの名無しさん2010/09/19(日) 05:14:50
ホントだ。ごめん、見逃してたわ。

49デフォルトの名無しさん2010/09/20(月) 03:53:30
なぜ下記のようなプログラムでエラーが発生するのかわかりますか??

 --- プログラム ---
#include "stdafx.h"
using namespace System;
using namespace System::Drawing;

int main(array<System::String ^> ^args){
  Bitmap^ image = gcnew Bitmap("test.jpeg");
  image->SetPixel(0,0,Color::Black);           ←ここでなぜかエラー起きます
  image->Save("test2.bmp");
  return 0;
}

 --- エラー内容 ---
ハンドルされていない例外: System.ArgumentException: 使用されたパラメータが有効ではありません。
場所 System.Drawing.Bitmap..ctor(String filename)
場所 main(String[] args) 場所 c:\documents and settings\***\デスクトップ\test\test.cpp:行 10
場所 mainCRTStartupStrArray(String[] arguments) 場所 f:\dd\vctools\crt_bld\self_x86\crt\src\mcrtexe.cpp:行 309

50デフォルトの名無しさん2010/09/20(月) 07:25:44
>>49
test.jpegはちゃんとプロジェクトファイルと同じ階層にある?

余計なお世話かも知れないが、.netでやるなら
C#で作ったほうが楽なんじゃないだろうか・・・
わざわざマイナーな環境で挑戦するよりもいいと思うんだが

51デフォルトの名無しさん2010/09/20(月) 08:08:59
>>49
落ちてる場所は、その上の行だぞ。

52デフォルトの名無しさん2010/09/20(月) 11:32:08
これだけ利用者に嫌われてる言語も珍しいな
初心者が質問するたびに使うなと勧められる

53デフォルトの名無しさん2010/09/20(月) 13:44:55
>>50-51
ありがとう。jpegじゃなくてjpgだったという凡ミスしていたことに気づけたわ

・・・一度C#に浮気してみる

54デフォルトの名無しさん2010/09/20(月) 13:53:46
>>52
嫌われているというか、言語自体が初心者お断りだからな
初心者が無謀なことしようとしていたら、そりゃ止めるだろう

55デフォルトの名無しさん2010/09/20(月) 14:01:21
C++も.NETも使いこなせる人が、止むを得ず使うための物。
使わなくていいなら使いたくない。

56デフォルトの名無しさん2010/09/20(月) 15:01:38
始めようにも資料が無さ過ぎる
MDI作るときどうするかとか
ちょっとしたことの逆引きがネット上で全く出てこない


ようやくOpenGL表示できるようになって
C++の頃の遺産をつかえると思ったのに

57デフォルトの名無しさん2010/09/20(月) 16:33:26
C#でできるから、それを参照にすればいい
なにもかもC++/CLIで済ませようとしないことをお勧めする

58デフォルトの名無しさん2010/09/21(火) 02:27:48
嫌ってはいないんだ
ただ何故かこの言語とのファーストコンタクトというか接し方が
一言入れておかないと不幸にしかならなそうな人が多いのよね

59デフォルトの名無しさん2010/09/21(火) 09:55:56
WinFormsデザイナとかC++/CLIにそもそも要らないんだよな
こういうのがあるから「Visual C++ 2008 で簡単GUIプログラミング」みたいな勘違い本やサイトが出て初心者が道を間違える

60デフォルトの名無しさん2010/09/21(火) 23:18:00
56ですが自分
C++の文法がある程度使えて
フォームデザインが総合開発環境上で扱えて
至れり尽くせりじゃん、と思ってとっかかりました

現実は情報が全く無く
よくわからないクラスとかいっぱいあって
解説も無くて

どうしようと途方にくれていましたが、QTとかよりは
導入コストも再勉強のコストも無いだろうと信じて使ってます。

だって、CやC++だとGUI作るの辛いんだもん
っていう理由だとダメですか

61デフォルトの名無しさん2010/09/21(火) 23:32:23
まあ正直C++の名前が付いてるだけで
マネージ部分はC++とは直接関係なくて学び直し必要だし

それなら素直にC#
C#2.0の範囲までなら多分C++/CLIより簡単だし
サンプルも多いし将来WPF/Silverlightとかにも応用できるし
C#やっとけば逆にC++/CLIを橋渡し用ぐらいなら書けるようになるし

62デフォルトの名無しさん2010/09/27(月) 13:44:31
けっきょくC++風に文法を汚したC#と普通のC++を無理矢理くっつけただけの代物だからな

63デフォルトの名無しさん2010/09/27(月) 14:03:20
>>62
それを一応形にできたところは評価できる。

64デフォルトの名無しさん2010/09/27(月) 19:28:25
#define健在なり

65デフォルトの名無しさん2010/09/27(月) 19:37:10
#define private public

66デフォルトの名無しさん2010/09/28(火) 02:31:06
LPVOIDからarray<String^>^に変換したいのですが、アドバイスください。
//////////Form1_Load//////////
HANDLE hMap;
LPVOID lpBuf;
hMap=CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,1024,L"View");
if(hMap==NULL){Form::Close();}
lpBuf=MapViewOfFile(hMap,FILE_MAP_ALL_ACCESS,0,0,0);
if(lpBuf==NULL){Form::Close();}
if(GetLastError()==ERROR_ALREADY_EXISTS){//すでに同じ名前のオブジェクトが存在する
lpBuf=Environment::GetCommandLineArgs();//コマンドラインから取得//ここでエラー
///////////ここまで/////////////
つまり二重起動時に共有メモリを使いたいのですが、どうしてもできません。
先人方どんなことでもいいので教えてくだせえ。

67デフォルトの名無しさん2010/09/28(火) 02:40:23
marshal_asとかじゃねえの

68デフォルトの名無しさん2010/09/28(火) 02:51:50
> LPVOIDからarray<String^>^に変換したい
>  lpBuf=Environment::GetCommandLineArgs();//コマンドラインから取得//ここでエラー
コードの方はarray<String^>^からLPVOIDに変換したいように見える

69デフォルトの名無しさん2010/09/28(火) 03:19:27
>>67
2008 Express Editionを使っていまして・・・ヘッダーがないらしいです。
http://www.codeguru.com/forum/showthread.php?t=468408
>>68
コマンドライン引数を得た後、array<String^>^に変換しようと思ったのです。
宣言時からarray<String^>^だとMapViewOfFileでつまずいちゃうので・・・。
どちらにせよ、コマンドライン引数を得た後、
共有メモリarray<String^>^として反映できればいいのですが。

70デフォルトの名無しさん2010/09/28(火) 03:50:07
全体にコードが滅茶苦茶に見えるし
そもそもLoadイベントなんかでやる処理には見えないけど(mainでやることだろ)

共有メモリにString^を書き込みたいのなら
> ttp://www.codeguru.com/forum/showthread.php?t=468408
のリンク先にString^をポインタに変換する方法が載ってるからmemcpyなりなんなりすればいい
複数の文字列を書き込む必要があるなら\0なりなんなりで区切る

71デフォルトの名無しさん2010/09/29(水) 06:10:09
共有メモリをやめてSendMessageに妥協しました
とにかく二重起動時にコマンドライン引数を渡すことができました!
皆様、貴重なアドバイスをありがとねん

72デフォルトの名無しさん2010/10/03(日) 12:39:42
C++/CLIにおけるsafe_cast,static_cast,dynamic_castの違いについて教えてくださいよ

safe_cast   :型が合わないと例外が発生、実行コスト中
dynamic_cast:型が合わないとNULLを返す、実行コスト大
static_cast  :型が合わなくても何もしない、実行コスト小

この認識であってますか?

73デフォルトの名無しさん2010/10/03(日) 16:11:05
safe_castとdynamic_castのコストはほぼ同じ。
static_castが速くなるのはダウンキャストの場合だけ。静的に解決できる場合はsafe_castと同じ。

74デフォルトの名無しさん2010/10/03(日) 20:39:28
>>66
いまさらだけど、.NET Framework 4以降ならMemoryMappedFileクラスを使えばいいと思うよ。

75デフォルトの名無しさん2010/10/03(日) 20:52:42
.NETのハンドルのダウンキャストにstatic_cast使うのは激しく疑問
公式の説明でもパフォーマンスをえらく強調してるが、
そのためにわざわざ検証不能コードにしてまでやるほどのものなのかと

76デフォルトの名無しさん2010/10/08(金) 20:22:23
http://www.infoq.com/jp/news/2010/10/Co-Evolution-Doubts
>どうやらそれらは、レガシC++アプリケーションをWindows Phoneに移植したいと考えている多くの開発者にとって、C++/CLIは、ベストなルートに見えるのであろう。

地獄への道は善意で舗装されている

77デフォルトの名無しさん2010/10/08(金) 20:28:08
筆者自身は否定的に見えるけど、まだそんなこと考えてる人もいるんだねぇ

78デフォルトの名無しさん2010/10/08(金) 20:52:06
筆者ほんとにC++/CLI触ったことあるのかな
Silverlightで使える範囲のC++/CLIはC++とは全く互換性なくてただの汚いC#なんだけど

79デフォルトの名無しさん2010/10/08(金) 21:47:31
絶対的処理性能が必要な場合か、過去資産使う時以外はメリットよな?

80デフォルトの名無しさん2010/10/08(金) 22:05:21
検証可能なコードしか使えない場合は処理性能同じだし過去資産も使えないよ

81デフォルトの名無しさん2010/10/09(土) 21:36:15
音の再生ってC++/CLIでできるの?
画像の場合ピクチャボックスみたいな感じに楽に音楽再生させたいのだけど

82デフォルトの名無しさん2010/10/10(日) 23:03:16
ネイティブのC++でできるなら同じ方法でできる
.NET使ってもできる
どちらにしてもC++/CLIとは直接関係ない話

83デフォルトの名無しさん2010/10/11(月) 00:46:33
サンクス
これ絶対初心者向けじゃない気がする

84デフォルトの名無しさん2010/10/11(月) 00:49:57
「気がする」ではない。
絶対初心者向けではない、その通りだ。

85デフォルトの名無しさん2010/10/11(月) 06:02:46
ですよね
俺みたいな勘違い君が集まるから
スレタイ変えると平和になる気がする

86デフォルトの名無しさん2010/10/11(月) 11:40:19
「C#でアプリを作っているが、C++のライブラリで音を鳴らしたい」もしくは
「C++(非CLI)でアプリを作っているが、.NETのライブラリを使って音を鳴らしたい」
→そこだけC++/CLIを部分的に使おう
という風に特別な意図を持って言語であって、
>>81のような質問が出てくる時点でC++/CLIを使うのは間違っている

87デフォルトの名無しさん2010/10/11(月) 12:08:45
前者はCLIでなくていいだろ

88デフォルトの名無しさん2010/10/11(月) 13:10:09
そんなに大きなライブラリでなければ>>19方式がベターだな

89デフォルトの名無しさん2010/10/11(月) 15:50:17
初心者用のC++/CLIじゃなくて
C++/CLIの初心者向けのスレなんだよなw

90デフォルトの名無しさん2010/10/11(月) 16:27:40
C++/CLI初心者にクラスチェンジできる条件が、

1) C++習得レベル一定以上
2) .NET習得レベル一定以上

だからな

91デフォルトの名無しさん2010/10/12(火) 02:47:19
C++とC#があった上で補助的に使うもんだからねぇ
みんな言うように初心者が使う物じゃないね。

92デフォルトの名無しさん2010/10/12(火) 15:18:47
こんなのに熟練したくないわ
どうしても必要なときにちょっと調べてその場が凌げれば充分

93デフォルトの名無しさん2010/10/12(火) 18:55:47
C++にGCを導入した言語。そう考えれば実用性は高いはず。

94デフォルトの名無しさん2010/10/12(火) 19:17:34
C++と、GCをサポートした別の言語を混ぜた言語。
アンマネージとマネージの境界は常に意識する必要がある。

95デフォルトの名無しさん2010/10/12(火) 20:52:46
仕事では使いたくないが、趣味でいじるのなら楽しい。
Express Editionだと実行中のプロセスにアタッチできるのが
C++しかないってのも使ってる理由のひとつ。

96デフォルトの名無しさん2010/10/27(水) 21:11:21
日経のムックでC++/CLIが宣伝されてるな。
簡単GUIプログラミング!みたいな見事な勘違い記事だった。騙されて道を誤る初心者が不憫でならない。

97デフォルトの名無しさん2010/10/30(土) 18:38:53
道を踏み外しそうになり、C++Builderにシフトできました

98デフォルトの名無しさん2010/10/31(日) 02:19:24
初心者はC#いじっとけ

99デフォルトの名無しさん2010/11/02(火) 23:54:01
増えた言語仕様って、ref, ^, gcnew だけでしょ?

100デフォルトの名無しさん2010/11/02(火) 23:59:30
ジェネリック,トラッキング参照,ファイナライザ,プロパティ,イベント,デリゲート, etc
CLI拡張の部分だけでも言語仕様書の量がC#並み

101デフォルトの名無しさん2010/11/03(水) 00:03:31
2種類の言語が同居してる構造だな。

102デフォルトの名無しさん2010/11/03(水) 04:25:15
D言語よりマシ。

103デフォルトの名無しさん2010/11/03(水) 16:45:49
Z言語になるころには
なんとなくこんな感じ、って思い描いたものが
1行で組みあがるくらいに

なるわけねぇ

104デフォルトの名無しさん2010/11/03(水) 17:28:32
ref classのメンバーに構造体がある場合、その構造体のポインターはどうやって取得すればいいの?
pin_ptr<SCRIPT_STRING_ANALYSIS*> pssa = &(this->構造体型の変数);
こういう風にしてもうまくいかないんだが

105デフォルトの名無しさん2010/11/03(水) 17:41:24
>>104
自己解決した
単にpin_ptrの型を間違っていただけだった

106デフォルトの名無しさん2010/11/11(木) 20:14:40
これって変数名とかに全角文字がつかえるのだな。
  int 数値 = 0;
みたいに。
うっかり全角アルファベット混ぜたりしたら大変だな。


107デフォルトの名無しさん2010/11/11(木) 20:26:13
それCLIでない方のC++でもできるよ
コンパイラが共通なんだから

108デフォルトの名無しさん2010/11/11(木) 22:11:50
>>106
今のパソコンて、ゼロに斜線が入らないから、うっかり

int 数値 = O;

とかしてしまうとやばいぜw

109デフォルトの名無しさん2010/11/12(金) 04:36:06
どっかでOが定義済みでないと通らないだろ

110デフォルトの名無しさん2010/11/12(金) 13:04:12
Windows Mobile用のWM_GESTUREが入ったgesture.hは何を入れたら良いんですか?

Windows Mobile 6 Professional SDK Refresh.msiと
試しにVS2010EEを入れてみたけど
ダメでした

Windows Mobile 6 Professional SDK Refresh.msiは2環境でインストールして
いるのでインストーラがコケたとかでは無さそうです
定義だけなのでGoogle Codeとかでも良いのですが、MS系は上手く手に入りません。

くだすれですがよろしくお願いします。

111デフォルトの名無しさん2010/11/13(土) 12:22:30
queue<array<String^>^ > queue_dwnload;
こう宣言すると
System.ArgumentException' の初回例外が発生しました。
とイミディエイトウィンドウにメッセージが出るんだけど
宣言の仕方どこが間違ってますか?

112デフォルトの名無しさん2010/11/13(土) 17:42:15
つ STL/CLI

#include <cliext/queue>
using namespace System;

cliext::queue<array<String^>^ > queue_dwnload;

113デフォルトの名無しさん2010/11/13(土) 18:21:47
すまん書き足りなかった、インクルードはちゃんとしてて
プログラムも正常に動作してます

それでもう少しシンプルなコードで試してみたんだけど
VS2008で新規作成、プロジェクト、CLRのwindowsフォームアプリケーション
のテンプレートでプロジェクトを作成して
#include <cliext/queue>を追加
~Form1(){}の下あたりに
cliext::queue<array<String^>^ > queue_dwnload;を追加
デバッグ実行する
これだけでメッセージが出ます、キューの宣言は間違ってないみたいだけど
何が原因なんだろう?

114デフォルトの名無しさん2010/11/13(土) 19:06:11
VS2010にしてしまっているので再現できないが、
~Form1()と同じprotectedには出来ないのかコンパイル時に警告がでる。
privateにしたらどう?

private: cliext::queue<array<String^>^ > queue_dwnload;

115デフォルトの名無しさん2010/11/13(土) 22:52:09
private:付けてもだめでした

116デフォルトの名無しさん2010/11/14(日) 14:34:28
とりあえず問題の切り分けだな。
まずコンパイルが警告なしで通るかどうか。
通るならデバッグ実行とデバッグなし実行で差があるかどうか。
別のPCでも再現するかどうか。

117デフォルトの名無しさん2010/12/02(木) 11:27:46
使用環境:VS2008 Professional Edition
プロジェクト:CLR クラスライブラリ
目的:コピーコンストラクタ、代入演算子を潰したい

エラーの出ないコード。
 ref class Hoge sealed {
  private:
   Hoge % operator=( Hoge const % rhd ) { return *this; } ;
   Hoge( Hoge const % src ) {} ;
 }

実装したいコード。
 ref class Hoge sealed {
  private:
   Hoge % operator=( Hoge const % ) ; // error LNK2020 未解決のトークン(06000001) Hoge::op_Assign
   Hoge( Hoge const % ) ; // error LNK2020 未解決のトークン(06000003) Hoge::ctor
 }

C++/CLIでメンバ関数の実装をせずに放置というのは可能でしょうか?

118デフォルトの名無しさん2010/12/02(木) 18:43:31
そもそもref classは定義しない限りコピーとか無理じゃなかったか

119デフォルトの名無しさん2010/12/02(木) 19:44:11
C#などから使わせるつもりなら演算子のオーバーロードは全部staticにしないといけないし
代入演算子やコピーコンストラクタはそもそもオーバーロードできないし
constも使えないし参照渡しや参照返しもダメ(そもそもref classだから無意味)
つかまずC#やるべき。.NETの常識が無さすぎ。

1201172010/12/02(木) 22:33:30
>>118
そうなんですか、回答ありがとうござます。

>>119
回答ありがとうございます。
http://msdn.microsoft.com/ja-jp/library/sy1y3y1t(VS.80).aspx
このサンプルコードのコンパイルが通らなかったのですが、そもそもサンプルが間違ってるという事なのでしょうか?
あと、.NETの常識を学ぶのにオススメの書籍などあれば教えていただけると幸いです。

121デフォルトの名無しさん2010/12/03(金) 11:24:33
Lock に関係ない実装は省略して書いてるだけでしょ
間違ってると言うより、そこは問題とは関係ない部分なだけ

1221172010/12/03(金) 12:41:30
>>121
回答ありがとうございます。
別途実装をするしか無いという事ですね。分かりました。

そうすると >>119 の回答から考えて、C#などから使わせるつもりが無いなら、
・演算子のオーバーロードはstaticにする必要はない
・代入演算子やコピーコンストラクタはオーバーロードできる
・constも使えて参照渡しや参照返しもOK
ということでしょうか?

123デフォルトの名無しさん2010/12/03(金) 15:36:41
C++/CLIではref classのメソッドにconstを付けられないから
C#やVBと相互運用しないとしてもconstパラメータは事実上役に立たない。

124デフォルトの名無しさん2010/12/04(土) 13:39:31
趣旨がわからないね。
C++スタイルでやりたいだけなら、そもそもC++/CLI 使う必要性がないんでない?

1251172010/12/04(土) 14:33:18
>>123
回答ありがとうございます。
Hoge % operator=( Hoge % arg ) { 代入処理の実装 } ;
これだと代入元が書き換えられそうで気持ち悪いですけど、そういう流儀なのですね。分かりました。

>>124
>>122 の質問に関しては元々あった疑問ではありません。
>>119 の解答に書かれている内容に関しての事実確認です。
趣旨に関してはスレ違いだと思いますので書きません。

126デフォルトの名無しさん2010/12/04(土) 14:48:36
%もいらん
ref classだから常にポインタ渡し

127デフォルトの名無しさん2010/12/05(日) 13:03:24
>>124
MSのサンプルだか自動生成されるコードだかで、
あんな風にrefクラス上でC++っぽいことをやっているものを見た覚えがある。
元の質問者のコードもそういうのに影響されたのではないかと思う。

128デフォルトの名無しさん2010/12/05(日) 14:36:18
private ref struct A{
UInt32 data[5];
};
これがコンパイル通らないんだけど、
array<UInt32>^ data;とかにしていちいちgcnewするしかないんですか?
データ宣言するだけのためにコードなんて書きたくないので、うまい解決法お願いします。

129デフォルトの名無しさん2010/12/05(日) 15:20:34
うん、array<UInt32>^にしてコンストラクタ書くしかないんではないかなあ。

130デフォルトの名無しさん2010/12/05(日) 21:27:52
C#では構造体でstackallocが使えるからvalue classならいけるだろうと思ったけど無理なのね
この手の機能でC#に負けてどうする

131デフォルトの名無しさん2010/12/05(日) 21:36:00
CStringを使うには何をインクルードすればよいの?
atlstr.h、atlbase.h、atlapp.hは入れてるけどコンパイルとまる

132デフォルトの名無しさん2010/12/06(月) 21:09:33
VC++2010 ExpressEditionです。

System::windows::form::timer で一秒ごとにlabel->textを更新していますが(要は時計です)
最小化から復帰するとlabel->textが更新されなくなります、何故でしょう。

133デフォルトの名無しさん2010/12/07(火) 22:12:40
最小化したときにとめたタイマーを元に戻すんだキバヤシ

134デフォルトの名無しさん2010/12/08(水) 00:35:19
そもそもUI用のタイマで時計を作るな
MSDNにもはっきりそう書いてあるだろ

135デフォルトの名無しさん2010/12/08(水) 00:44:46
>>133

故意に止めるようなことはしていないんですが、そういう仕様なんでしょうか?

136デフォルトの名無しさん2010/12/08(水) 00:46:00
>>134

えぇぇぇぇぇ。時間分解能が悪いとかあの辺ですか!ヽ(´Д`;)ノアゥ...
スレッドタイマークラスとかに変えます。ご教授ありがとうございます。

137デフォルトの名無しさん2010/12/08(水) 00:57:53
MS公式のガイドラインかなんかで「System.Windows.Forms.Timerで時計を作らないでください」って無かったっけ?
どこだったか忘れたけど

138デフォルトの名無しさん2010/12/08(水) 11:59:01
一番使い易いところにあるのに、一番性能悪いとかひでー話だよな
俺も最初使ってみて混乱した

139デフォルトの名無しさん2010/12/08(水) 14:19:36
使い方も知らずに使うとか・・・

140デフォルトの名無しさん2010/12/09(木) 00:12:13
VS2005です。
C++/CLIでラップしたネイティブのライブラリから例外が発生して、
C++/CLI側でcatchした時に、
ネイティブ側のインスタンスのデストラクタが呼ばれません。
これはバグと考えて良いのでしょうか?

VC++2010 expressでは普通に呼ばれたので・・

141デフォルトの名無しさん2010/12/09(木) 03:14:40
>>132です。

あれからいろいろいじりまくっていたんだけど、どうもフォームの透過色(TransparencyKey)が特定の色の場合
この問題が発生しているようです。引き続き調べてみます。

1421402010/12/10(金) 18:48:44
全く相手にされてないようですが、
解決したので適当に報告しときます。

とりあえず、ネイティブのライブラリオプションを
/EHscから/EHaに変更することで、デストラクタが呼ばれるようになりました。

どうやらオプションの違いでABIに互換性が無くなり、
例外をハンドルできても、その後のアンワインディングを正常に実行できていなかったようです。

デフォルトのオプション設定だと上記のような状態になるので、
自分みたいに知らずに組んでる人はメモリリークし放題ですね。

143デフォルトの名無しさん2011/01/11(火) 22:48:33
C++/CLIでSystem::Actionって使えないの?
event Action^ Foo;
とやると
エラー1error C2955: 'System::Action' : クラス ジェネリック を使用するには ジェネリック 引数リストが必要です
って出てくる…

144デフォルトの名無しさん2011/01/11(火) 22:54:33
Action<T>はmscorlib.dllだがそれ以外はSystem.Core.dllだ

145デフォルトの名無しさん2011/01/11(火) 22:57:47
>>144
ありがとう…
おまえそんなところにいたのか…

146デフォルトの名無しさん2011/02/05(土) 21:22:18
聞きたいんだけどスレ住人はVC2010でC++/CLI書いてる?
それともインテリセンス使うために2008書いてる?
それともC++/CLI書かない?

147デフォルトの名無しさん2011/02/05(土) 21:30:17
C++/CLI書かない…けど次の案件がVS2010指定でネイティブDLL呼び出す必要があるから
書かざるを得なくなるかもしれなくてちょっと憂鬱

148デフォルトの名無しさん2011/02/05(土) 22:28:46
.NET用言語で一番の糞言語だからね>C++/CLI

149デフォルトの名無しさん2011/02/05(土) 22:49:37
>>148
C++自体が言語として糞だから仕方がない。
それと互換性保ちながらここまで実現したということを考えると、かなりすごいと思う。

150デフォルトの名無しさん2011/02/05(土) 22:50:52
互換性?ねーよ。

151デフォルトの名無しさん2011/02/05(土) 22:54:50
>>150
え。それは、今では使うのは好ましくないとされているレガシー関数群をいまだにお使いになられているからではないですか?

152デフォルトの名無しさん2011/02/06(日) 11:47:30
CとC++に互換性があるとは言わないだろ
CLIの部分については互換性ゼロなんだから

153デフォルトの名無しさん2011/02/06(日) 11:51:41
>>152
> CとC++に互換性があるとは言わないだろ
それは上位互換ありでしょ。完全ではないけれども。

154デフォルトの名無しさん2011/02/06(日) 12:50:45
boostを完璧にコンパイルできないだろとか言い始めるのかと思ったら
斜め上をいく馬鹿だったか

155デフォルトの名無しさん2011/02/08(火) 22:27:38
初心者です。
ストリップメニューを開くと5個ぐらい項があって
3つチェックされているとして、その3という数字を取りたいのですが
どうすれば良いでしょうか?
開く部分の変数はStripMenuItem1です。
for(int = 0;i<StripMenuItem1->項目数;i++){if(StripMenuItem1->子項目->checked == true){temp++;}}
みたいなのはありますでしょうか?どうすれば良いでしょうか?よろしくおねがいします

156デフォルトの名無しさん2011/02/08(火) 22:55:33
自前で数えろよ、毎回書くのがいやなら関数にしとけ。

157デフォルトの名無しさん2011/02/08(火) 23:02:04
>>155
StripMenuItem1.Itemsプロパティで子が全て取得できる
言っちゃ悪いけどそういう意味での初心者がC++/CLIなんか使うもんじゃない
先にC#覚えて

158デフォルトの名無しさん2011/02/08(火) 23:03:11
>>156
レスありがとうございます
申し訳ありません。理解できません
何か関数があるのでしょうか?
自前で数えるといっても、2個チェックのときは2と自動で取ってこれるようにしたいのです。
そういえば
if(項の変数->checked == true){temp++;}
を何行も書けばいいだけですね。ありがとうございました!

159デフォルトの名無しさん2011/02/08(火) 23:03:52
>>157
ありがとうございました!

160デフォルトの名無しさん2011/02/08(火) 23:11:25
ときどき勘違いした可哀想な子が紛れ込んでくるな
>>21>>42はまだC++/CLI使ってるんだろうか

161デフォルトの名無しさん2011/02/09(水) 00:53:00
次スレでは「初心者用」を消して、

> - C++プログラミング
> - .NETプログラミング (C#, VB.NET, etc.)
>
> に不自由する方はお引き取りください

とか若干きつめに書いておけばいいじゃね?

何年先になるかは分からんけどw
4,5年ぐらい?ww

162デフォルトの名無しさん2011/02/09(水) 06:13:09
WCHAR f[] = aToolStripMenuItem->Text->ToCharArray();
cli::array<Type,dimension> ^' から 'WCHAR []' に変換できません。
->ToCharArray();でWCHARが帰ると思っていたのですがなぜでしょうか?どうすれば良いですか?

163デフォルトの名無しさん2011/02/09(水) 06:31:17
そのWCHAR[]をどうしたいかによる

164デフォルトの名無しさん2011/02/09(水) 06:33:29
>>163
wcscpyしたいです。
というか元々wcscpyの引数に入れるつもりでしたができませんでした。

165デフォルトの名無しさん2011/02/09(水) 07:06:40
>>163
ちなみに、第二引数にその->TEXTの文を入れて
別に用意した第一引数のWCHAR[3][]とかに入れたいのです

166デフォルトの名無しさん2011/02/09(水) 07:48:58
>>161
もともとは初心者お断りスレもあったが、話題があまりなくて落ちた
>dat落ち姉妹スレ
>C++/CLI part3

167デフォルトの名無しさん2011/02/09(水) 09:38:59
このスレでもC++、.NETの初心者は対象外だけどな

168デフォルトの名無しさん2011/02/09(水) 11:16:29
>162
文字列操作はこれがひっかかったぞ
ttp://vene.wankuma.com/prog/CppCli_strings.aspx

169デフォルトの名無しさん2011/02/09(水) 11:18:17
>>168
サンクス
おせーよ

170デフォルトの名無しさん2011/02/09(水) 15:36:36
C++と.NETの両方を極めないとCLIは使いこなせないからな

171デフォルトの名無しさん2011/02/12(土) 16:44:50
Express EditionでもC#プロジェクトと同じソリューションに入れられればいいのになあ
VCのExpress Editionが入門者向けというより達人の縛りプレイ用になってるじゃないか

172デフォルトの名無しさん2011/02/12(土) 17:53:40
CLI使わないという選択肢はないのかw

173デフォルトの名無しさん2011/02/12(土) 18:35:17
そんな選択肢があったらこのスレにいない

174デフォルトの名無しさん2011/02/13(日) 04:23:39
>>171
金払え

175デフォルトの名無しさん2011/02/18(金) 09:47:29
ダイアログで値を入力させて、その値を親ウィンドウで処理したい場合に
どうやって値の受け渡しをすればいいの?
親にpublic関数を用意して呼び出すのが簡単なわけだけど
この.hファイルに親の.hファイルをインクルードすると子のデザイナが壊れる
子ダイアログで親の形を認識させる手段がない

176デフォルトの名無しさん2011/02/18(金) 10:00:22
子のプロパティを公開して親からアクセスすればいいんじゃねえの?

177デフォルトの名無しさん2011/02/18(金) 16:30:00
比較関数を書く形式で、リスト(cliext::list)をクラスのメンバで
ソートするにはどうしたら良いでしょうか?
こんな感じじゃないかと思うのですが
「関数呼び出しには引数リストがありません。
メンバへのポインタを作成するために '&Test::Form1::less' を使用してください」
とエラーが出ます
以下コードを簡略化して書いてます

//クラスTest
ref class Test
{
public:
DateTime date;
Test(void){};
};

//比較関数
bool less(Test^ lhs, Test^ rhs)
{
return lhs->date < rhs->date;
}

//リストの作成
list<Test^> list_item;
Test^ item = gcnew Test();
list_item.push_back(item);//(以下省略

//ソートする
list_item.sort(less);

178デフォルトの名無しさん2011/02/18(金) 17:09:32
試してないけど、static にして Test::less じゃね?

179デフォルトの名無しさん2011/02/18(金) 17:41:53
レスありがとうございます
Form1クラスの上で定義したらできました
いまいちよくわからないですが
これからじっくり理由を考えて見たいと思います、感謝

180デフォルトの名無しさん2011/02/20(日) 21:49:54.49
VC++のスレでこちらの方がふさわしいのではないかと言うことで移ってきました。

 VC++2010 Expressでフォームからマウスが外れているときはフォームの透明度を
あげる(薄くする)と言うプログラムを組んでいます。フォームのMouseLeaveイベントと、
MouseEnterイベント発生時にOpacityプロパティを変えることで実現を目論んだのです
が、ウインドウの外枠(サイズを変えるときにドラッグする部分や、上部のウインドウ名
が書かれている部分)にマウスがあると、MouseLeaveイベントが発生して、薄くなって
しまいます。もちろん、ここではたとえ、フォーム外側から移動してきてもMouseEnter
イベントは起きません。
 フォームから完全にマウスカーソルがそれた時のみ透明度を高めたいのですが、
どういうイベントを用いればよいんでしょうか?

181デフォルトの名無しさん2011/02/21(月) 01:14:11.85
で、その質問内容のどこがC++/CLIに関係しているんだ?

1821802011/02/21(月) 07:06:34.79
ってことは、.Net Frameworkのスレ探します。

1831802011/02/21(月) 07:08:31.22
.net Framework関連のスレって見つからないんですが、どこが適切でしょう。
すみません。

184デフォルトの名無しさん2011/02/21(月) 07:51:25.56
ふらっとあたりで聞けばいい

185デフォルトの名無しさん2011/02/26(土) 23:54:49.36
ref classのメンバー変数にID2D1SolidColorBrush*のようなものがある
template <class T> inline void SafeRelease(T *ppT)
{
unsigned long refCount;
if (*ppT)
{
refCount = (*ppT)->Release();
*ppT = NULL;
}
}
にID2D1SolidColorBrush*のポインターを渡すことが出来ないからpin_ptrで渡してたんだが、いい加減書くのがめんどくさくなってきた
スマートに処理しようと思い、template <class T> inline void SafeRelease(T *%ppT)というパラメーターの関数を定義したんだが、こいつへの渡し方がわからない
誰か教えてくれまいか

186デフォルトの名無しさん2011/02/27(日) 02:13:39.66
あるプロセスをオープンしようとしてます
読み取り専用で試したが結果は同じ
CLIとしてコンパイルしたWindowsアプリからOpenProcessを呼び出すとフル権限で開ける
C++としてコンパイルしたコンソールアプリからはOpenProcess読み取り専用でもアクセス拒否される
OSはWindows7 64bit
内部のことは分からないですが、OpenProcessは同じ標準process.h内のものを使ってると思う
少なくともソース上ではそういう記述をしてますがコンパイラが何をしてるかまでは定かじゃないです
大きな違いはコンソールアプリであることですが、それが拒否の原因になるんでしょうか?

187デフォルトの名無しさん2011/02/27(日) 18:39:56.37
VC2010を使用しています。
テキストボックスに文字が入力され、エンターを押されたら動作する処理を行いたいのですが、
TextChangedイベントに
if(TextBox1->Text->EndsWith("\r\n"))
では、認識出来ないのですが、どのようにすればよろしいのでしょうか?

よろしくお願いします。

188デフォルトの名無しさん2011/02/27(日) 19:14:15.81
フレームワークの話しはスレ違い

189デフォルトの名無しさん2011/02/27(日) 19:44:49.91
フレームワークの話はどこですれば良いのでしょうか?

190デフォルトの名無しさん2011/02/27(日) 19:48:31.21
C#の質問にして、ふらっとC#で聞くといい

191デフォルトの名無しさん2011/02/28(月) 15:45:27.41
>185
com::ptr で保持して、リリース処理はそっちで対応しちゃあかんの?

1921852011/02/28(月) 18:59:52.28
>>191
ref classにはcom::ptrはおけない思う

193デフォルトの名無しさん2011/02/28(月) 19:01:42.54
>>192
すまん。
CComPtrと勘違いしてた
com:ptrはCLRでも使えるのか

194デフォルトの名無しさん2011/02/28(月) 19:28:37.85
>193
それ用のクラスだぜ
あとは .net Framework の System::Runtime::InteropServices::SafeHandle を実装したら?

195デフォルトの名無しさん2011/02/28(月) 20:58:29.72
DirectXのリソースの解放にSafeHandleは使えないんじゃなかったっけ
最近のは知らんけど

196デフォルトの名無しさん2011/02/28(月) 23:42:18.77
>187
KeyPress

197デフォルトの名無しさん2011/03/01(火) 00:17:52.54
>195
詳しく

198デフォルトの名無しさん2011/03/01(火) 01:40:02.26
Direct3D自体の作成/解放が1スレッドに限定されるのに対し
ファイナライザスレッドでどーのこーのみたいな話だったか

使えないというか使う意味がない、みたいな

199デフォルトの名無しさん2011/03/10(木) 18:48:24.24
printfとか普通に書いたとき、
なんでprintfがアンマネージのコードって
コンパイラは理解できるの?

それらしい印になるようなキーワードを
特に書いてないような気がするのだが?

200デフォルトの名無しさん2011/03/10(木) 18:56:54.84
内部的には #pragma managed や unmanaged 指定がされてんじゃね?
#include か #using かで切り分けてるんだと思うけど

201デフォルトの名無しさん2011/03/15(火) 00:19:49.85
失礼します。

Form1からForm2を開き、Form2を表示した状態でForm1のテキストボックスにフォーカスを合わせたいのですが、何か良い方法はありますでしょうか?
Form2のShownイベントで、Form1->TextBox1->Forcus();を実行してみましたが、Form1が見つかりませんでした。
よろしくお願いします。

202デフォルトの名無しさん2011/03/15(火) 14:20:33.94
見つかりませんでしたじゃなくて
見つかる様にするんだよ。
作成時にインスタンス渡すとか、間を取り持つ作るとか

2032012011/03/23(水) 22:44:49.12
http://imagingsolution.blog107.fc2.com/blog-entry-109.html
ここを参考に、Ownerを指定してもダメでした。

と、言うよりサンプル通りに作ってみても
1>d:\vc2010\test\form2test\form2test\Form2.h(60): error C2039: 'Form2_Load' : 'Form2Test::Form2' のメンバーではありません。
1> d:\vc2010\test\form2test\form2test\Form2.h(15) : 'Form2Test::Form2' の宣言を確認してください。
1>d:\vc2010\test\form2test\form2test\Form2.h(60): error C2065: 'Form2_Load' : 定義されていない識別子です。
(以下略)
と、なってしまいました。

Form2.hの宣言
this->AutoScaleDimensions = System::Drawing::SizeF(6, 12);
this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
this->ClientSize = System::Drawing::Size(292, 273);
this->Name = L"Form2";
this->Text = L"Form2";
this->Load += gcnew System::EventHandler(this, &Form2::Form2_Load);
this->ResumeLayout(false);

Form2.cppにて
#include "Form1.h"
using namespace Form2Test;

System::Void Form2::Form2_Load(System::Object^ sender, System::EventArgs^ e) {
Form1^ PForm;
if(this->Owner != nullptr){
PForm = static_cast<Form1^>(this->Owner);
}
}

この記述では間違っているのでしょうか?VC2010を使用してます。
よろしくお願いします。

204デフォルトの名無しさん2011/03/24(木) 02:14:35.75
本当にForm2はグローバル名前空間なのか?

とりあえずヒントだけ出したけど、C++、.NET、プログラミングの基礎にあたる内容はスレチだから返答は不要
というか、C++/CLIはコンパイル可能なコードすら書けないようなプログラミング初心者が使うものじゃない

205デフォルトの名無しさん2011/03/24(木) 04:38:21.64
VC++2010&CLIで4.0以前(4.0は含まない)のNETを使う方法はありますか?
MSDNには3.5を利用するには2008SP1を入れろとかありましたが
NETのバージョンごとに入れるのはさすがに無駄すぎるので。

206デフォルトの名無しさん2011/03/24(木) 11:57:27.41
http://msdn.microsoft.com/ja-jp/library/ff770576.aspx
プロジェクトファイルをテキストエディタで編集しろということらしい
C++/CLIで作った混合アセンブリはCLR2(.NET2.0-3.5)向けにコンパイルすると
CLR4では動作しなくなるので注意
インテリセンスも削られてるのでC++/CLIなら2008で作業するほうがいいよ

207デフォルトの名無しさん2011/03/24(木) 20:41:15.80
>>206
http://msdn.microsoft.com/ja-jp/library/47w1hdab.aspx
こちらのページを読んだところ
2010は4.0だけ、2008SP1なら3.5だけなのかと思ってしまったのですが
2008SP1は2.0〜3.5まで扱えるんですね
2008を入れることにします
ありがとうございました

208デフォルトの名無しさん2011/04/01(金) 22:50:53.88
質問です

画面を表示させ、ボタンを押したら表示されている画面をbitmapイメージとして保存(出来れば印刷も)したいのですが、
そういう事は可能なのでしょうか?
サンプルソース等探してみたのですが見つからなくて行き詰ってしまいました。

209デフォルトの名無しさん2011/04/01(金) 22:54:32.68
C# スクリーンショット でググれ
C#だぞ。C++/CLIじゃないぞ。

210デフォルトの名無しさん2011/04/01(金) 22:57:17.22
>>209
なるほど、C#で調べれば良かったんですね。。
自身に[Alt]+[Print Screen]を送れば良かったんですね
ありがとうございます

211デフォルトの名無しさん2011/04/02(土) 12:02:12.18
フォーム上にメニューバーを追加したいんですが
どういうソース書けばいいんでしょうか?

212デフォルトの名無しさん2011/04/02(土) 12:06:00.79
C# MenuStrip でググれ
C#だぞ。C++/CLIじゃないぞ。

213デフォルトの名無しさん2011/04/02(土) 12:31:38.06
サンクス

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

226デフォルトの名無しさん2011/04/10(日) 21:49:49.30
こういうこと?
ttp://www.atmarkit.co.jp/fdotnet/dotnettips/021gc/gc.html

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

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

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

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

2312272011/04/23(土) 09:53:36.44
>>228-230
レスありがとう

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

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

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

233デフォルトの名無しさん2011/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デフォルトの名無しさん2011/04/23(土) 12:31:41.38
clrをマネージだけで使うとかかなりマゾい人だな

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

2362272011/04/23(土) 18:24:35.15
>>232-235
レスありがとう

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

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

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

239デフォルトの名無しさん2011/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デフォルトの名無しさん2011/04/24(日) 19:23:40.94
スレ違い

2412392011/04/24(日) 19:27:37.31
すみません

242デフォルトの名無しさん2011/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デフォルトの名無しさん2011/04/24(日) 20:55:50.28
WCHAR [32]' から 'System::Object ^' に変換できません

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

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

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

msclr::interop::marshal_as

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

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

248デフォルトの名無しさん2011/04/25(月) 04:59:47.67

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


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

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

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

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

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

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

2542492011/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);

サロゲート対応のコードを書いてみました。
http://ideone.com/rXbuf

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

278デフォルトの名無しさん2011/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デフォルトの名無しさん2011/05/26(木) 20:26:26.71
このコンパイルエラーになる
System::Collections::Hashtable ^^ppHashtable1;
って何とかならんかいな。多重ループで毎回dynamic_cast演算子使ってる
と効率悪いだろうし。

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

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

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

284デフォルトの名無しさん2011/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できないからアンマネージは使えない。

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

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

287デフォルトの名無しさん2011/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デフォルトの名無しさん2011/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デフォルトの名無しさん2011/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();
}

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

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

2932762011/06/01(水) 06:53:05.38
ありがとうございました。
たいへん参考になりました。

294デフォルトの名無しさん2011/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デフォルトの名無しさん2011/06/01(水) 21:57:49.20
C++/CLIにおけるジェネリックメソッドとテンプレート関数の違いを説明してくださいお願いします

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

297デフォルトの名無しさん2011/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デフォルトの名無しさん2011/06/04(土) 15:04:33.10
本二冊読んでvalue classが出てこないってありえるのか…?

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

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

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

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

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

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

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

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

3072942011/06/05(日) 04:08:13.35
>>296さん
ありがとうございました。

3082942011/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デフォルトの名無しさん2011/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デフォルトの名無しさん2011/06/08(水) 20:55:56.86
VC++6.0のMFCなプログラムとVC++2008 Express Edition の.NETなプログラムで
プロセス間通信したいのですがどうすればいいですか。

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

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

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

314デフォルトの名無しさん2011/06/22(水) 06:08:56.94
FillRectangle

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

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

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

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

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

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

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

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

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

MSは鬼や

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

372デフォルトの名無しさん2011/09/16(金) 11:52:55.12
http://msdn.microsoft.com/en-us/library/windows/apps/hh454076%28v=VS.85%29.aspx
なんかわけのわからないことになってるぞ
C++/CLI切ってネイティブのC++にC++/CLI風のCOM拡張を入れるらしい

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

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

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

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

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

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

http://msdn.microsoft.com/ja-jp/library/6xfx8bsa(v=VS.80).aspx

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

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

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

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

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

384デフォルトの名無しさん2011/10/16(日) 23:44:09.15
WebBrowserコントロールにNewWindow2イベントを実装する
http://main.tinyjoker.net/Tech/CSharp/WebBrowser%A5%B3%A5%F3%A5%C8%A5%ED%A1%BC%A5%EB%A4%CBNewWindow2%A5%A4%A5%D9%A5%F3%A5%C8%A4%F2%BC%C2%C1%F5%A4%B9%A4%EB.html

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

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

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

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

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

389デフォルトの名無しさん2011/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デフォルトの名無しさん2011/10/29(土) 09:24:47.38
その前にusing namespace System::Windows::Forms;を入れることを激しくおすすめするw

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

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

393デフォルトの名無しさん2011/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デフォルトの名無しさん2011/10/29(土) 10:15:21.39
配列を作ったら次は各要素にToolStripItemのインスタンスを代入する
C#の入門書買って出直してきたら

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

http://msdn.microsoft.com/ja-jp/library/bb384865.aspx

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

442デフォルトの名無しさん2011/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デフォルトの名無しさん2011/12/12(月) 21:18:25.11
MFC の CString 使ったら?

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

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

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

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

448デフォルトの名無しさん2012/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));
}

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

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

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

4504482012/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();
}
http://is.gd/BgDTis

451デフォルトの名無しさん2012/01/16(月) 10:35:10.44
ttp://www.cetix.de/DotNetNews/Thread61630-String_to_string_-_truncates_at_255.aspx
これか?
試してないけど。

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

487デフォルトの名無しさん2012/05/27(日) 20:25:49.04
引数としてstring型の配列を用いたいのですが・・・
自分C#しかやったことないので・・・

488デフォルトの名無しさん2012/05/27(日) 20:28:19.00
void foo(cli::array<System::String^> ^bar);

489デフォルトの名無しさん2012/05/27(日) 20:33:46.88
Thank you sir.

490デフォルトの名無しさん2012/05/31(木) 15:51:08.78
cli::array<System::String^> ^hoge を char* hogehoge[] に変換したいのですが・・・

491デフォルトの名無しさん2012/05/31(木) 16:43:56.11

4924912012/05/31(木) 17:00:23.87
すまん、コンストラクタが例外安全でなかったので修正した
http://ideone.com/xbcbh

493デフォルトの名無しさん2012/05/31(木) 17:15:25.25
全然わかんね

494デフォルトの名無しさん2012/05/31(木) 17:26:57.22
cli::array<System::String^> ^hoge = ...;
char_pp p(hoge);
char** hogehoge = p.get();

ってことなんだが

char** は char* xxx[] を引数に取る関数にそのまま渡していい

495デフォルトの名無しさん2012/05/31(木) 18:36:01.89
Hmm...

496デフォルトの名無しさん2012/05/31(木) 18:57:30.99
補足しておくと
・PtrToStringCharsで内部ポインタを取得
・System::Stringはunicodeなのでwcstombs_sでマルチバイト文字列に変換
・std::auto_ptr, std::vector, char_ppはRAIIイディオムにより例外安全にするため
・try{}catch(...){throw;}もchar_ppコンストラクタを例外安全にするため
用語はググってくれ

もしC++初心者で.NETからよそのライブラリ使いたいとかなら
C#からP/Invokeした方が多分楽

497デフォルトの名無しさん2012/05/31(木) 19:02:53.62
P/Invokeですか・・・

498デフォルトの名無しさん2012/06/01(金) 00:26:18.04
そんなコード書かれたら、俺なら普通に書き直しさせるわ
文字列のマーシャリングで標準のマーシャリング以外を使うなよ

marshal_context c;
for (...) native_str[i] = c.marshal_as<char*>(managed_str[i]);

499デフォルトの名無しさん2012/06/01(金) 03:21:17.29
それコンパイル通るの?

500デフォルトの名無しさん2012/06/01(金) 15:18:44.76
MFC 使うんだったら、CString に直接放り込めばいいだろうに
CString strBuff(strManaged);

501sage2012/06/08(金) 17:29:51.46
VC++2008のC++/CLIでUSBカメラが抜かれたことを検知したいのですが,どなたかわかりませんか?
USBメモリーなら
virtual void WndProc(System::Windows::Forms::Message% m) override
{
if(m.Msg == WM_DEVICECHANGE)
{
switch((int)(m.WParam))
{
case DBT_DEVICEREMOVECOMPLETE:
MessageBox::Show("out");
break;
case DBT_DEVICEARRIVAL:
MessageBox::Show("in");
break;
}


}

Form::WndProc(m);

}
で判断できたんですが,USBカメラだとm.Wparamが変化しません...

502デフォルトの名無しさん2012/06/09(土) 12:49:43.11
c++を使い始めたものなんですけど

こっちはちゃんとなるんですけど
http://www.dotup.org/uploda/www.dotup.org3073322.jpg

includeを使うと
http://www.dotup.org/uploda/www.dotup.org3073352.jpg


こんな感じになっちゃって・・・(´;ω;`)


だれか解決して下さいませんか?

503デフォルトの名無しさん2012/06/09(土) 12:58:27.44
苦Cか

504デフォルトの名無しさん2012/06/09(土) 13:00:34.24
>>503
正解
あれはとてもためになります
ところで
対処の方法は?

505デフォルトの名無しさん2012/06/09(土) 13:20:04.01
まずスレタイを読みます

506デフォルトの名無しさん2012/06/09(土) 13:21:59.00
>>505
読みました
さようなら

507デフォルトの名無しさん2012/06/09(土) 13:40:18.44
わろた

508デフォルトの名無しさん2012/06/19(火) 22:37:50.62
DOSで趣味でプログラム組んでた程度で、APIめんどくせ、MFCうぜえってレベルなんだが
久しぶりにちょっとしたゲームでも作ろうとして
VCに無料版があるのか!と飛びつき
無料版でフォームの統合環境まであるんか、今はMFCにかわってCLRなんかと早とちりし
ネット漁ればサンプルやら何やらゴロゴロしてるかと思えば…
何じゃこりゃ

509デフォルトの名無しさん2012/06/19(火) 23:16:03.51
CLRってなんだよ。CLIはMicrosoftにも見捨てられかけてるのでね…泣けてくる。
どうせ.NET使うならもうC#で全部やっちまえよって感じか?

510デフォルトの名無しさん2012/06/20(水) 01:01:15.51
CLIは規格の名前、それのMSによる実装がCLR
CLRに大量のライブラリ群を加えたやつが.NET Framework

CLIに対応する構文を追加したC++だからC++/CLI

>どうせ.NET使うならもうC#で全部やっちまえよって感じか?
その通り。過去の資産を使わないといけないというような、必要に迫られて仕方なく使う物だよ。

511デフォルトの名無しさん2012/06/20(水) 01:14:40.12
ところでVC++のC++/CLIってMS CLRじゃなくて純粋なCLIで動くの?
一応CLIではアセンブリはネイティブイメージを持てるという決まりだった覚えがあるけど
細かい相互運用のことは決まってなさそう

512デフォルトの名無しさん2012/06/20(水) 03:37:32.95
C++/CLIをMonoで動かそうとするとCRT使えない&/clr:pureだったよね。今は変わったのかな?

513デフォルトの名無しさん2012/06/20(水) 07:32:37.59
>>508
そういう用途だったら、C#おすすめだけどね。
プロトタイピングに最適!

514デフォルトの名無しさん2012/06/20(水) 11:20:48.23
/clr:safe だね。

using namespace System;
int main(array<String^>^ args) {
  Console::WriteLine("Hello World !");
}

cl /clr:safe test.cpp
mono test.exe
でいける。

515デフォルトの名無しさん2012/06/24(日) 02:05:59.36
http://www.atoker.com/blog/2012/04/12/llvm-europe-2012-cli-compiler/
ClangベースにC++/CLIコンパイラ作ったという話。
(1)と(2)とあるけど、どちらもVisual C++の吐く
混在アセンブリとは違う仕組みっぽい感じがする。

516デフォルトの名無しさん2012/06/24(日) 20:35:21.91
VC++のclrで,ref classはなぜref classからしか継承できないんでしょうか?
仕組み的に継承先でgcとか実装されるなら別にvalue classからとかでも継承できていいと思うんですけど……

517デフォルトの名無しさん2012/06/24(日) 22:14:12.48
というか普通のクラスをpublic refで継承したいのおおおお

518デフォルトの名無しさん2012/06/25(月) 11:36:44.70
継承出来ても仕組み上ハンドル変数にしか入れられないから意味なくね

519デフォルトの名無しさん2012/06/25(月) 15:36:06.92
構造体がなんかインターフェイスを実装してる場合には意味ないこともないが
CLIを拡張するのに見合った利益があるかどうか考えると当然切り捨てだろうな
あくまでC#とVBが主役なんだからC#やVBから使えないクラス作っても意味ない

520デフォルトの名無しさん2012/06/25(月) 18:42:31.48
混合型ェ・・・

521デフォルトの名無しさん2012/06/25(月) 22:06:41.59
混合型こそ仕組み的には特にできない理由がなくて比較的大きな利益のあるものだよな
CLIやCLRを弄る必要もなく、コンパイラだけで対応できるはず
永遠に将来的に対応予定だが

522デフォルトの名無しさん2012/06/26(火) 10:12:49.68
いや仕組み的に無理だから

マネージド領域のポインタはfixedなしに取得してはいけない
実装部分でそれを止める(無いことを保証する)には宣言部分で付加情報が必要
それがrefキーワード

ヒープ領域ならポインタを取得するのは問題ない
だからrefクラスのメンバにポインタ型なら定義可能
コンストラクタでnewしてCLIデストラクタ(IDisposable)でdeleteすること

523デフォルトの名無しさん2012/06/26(火) 10:13:55.17

template <typename T> ref class ref_auto_ptr{
   T* p;
public:
   ref_auto_ptr(T* ap):p(ap){}
   ~ref_auto_ptr(){delete p;}
   T* get(){return p;}
};

struct val_class{
   val_class(){Console::WriteLine(L"new val_class");}
   ~val_class(){Console::WriteLine(L"del val_class");}
};

ref class ref_class{
public:
   ref_class():p(new val_class()){}
   ref_auto_ptr<val_class> p;
};

int main(array<System::String ^> ^args){
   ref_class c;
   Console::WriteLine(L"a");
   return 0;
}
-----------------
new val_class
a
del val_class

524デフォルトの名無しさん2012/06/26(火) 12:26:48.81
仕組み的に無理って
C++/CLI のもともとの目的は混合型を実現することだったんじゃなかったか?

525デフォルトの名無しさん2012/06/26(火) 16:07:00.24

526デフォルトの名無しさん2012/06/26(火) 22:12:26.16
PODなネイティブ構造体をマネージ型に置いたり、マネージハンドルをメンバに持たない
マネージ構造体をネイティブ型に置いたりするのは別に問題ないが(ミスを誘発しやすいという懸念はあるが)
もっと一般的に混合型を扱えるようにする構想があったからとりあえず全部禁止しといたってことか
で結局はC++/CLIそのものが見捨てられて計画倒れになり、理不尽な制限として残ってしまったと

527デフォルトの名無しさん2012/06/27(水) 03:22:10.94
ちょっとした配列をメンバに持ちたいときにmallocしたりgcnewしたりしないといけないのは
なんとかならんかったんかなぁ、と思う。

528デフォルトの名無しさん2012/06/27(水) 08:24:51.05
>>525
Point* G(R^ r) {
pin_ptr<Point> pinp = &r.p;
return pinp;
}
これってGCの問題というよりはC++でもよくあるミスの一種だよね
ローカル変数のポインタを残すなってのと同類

529デフォルトの名無しさん2012/06/27(水) 10:51:13.99
初心者みたいな質問ですがすみません。

今、マネージコードからネイティブなコードを呼び出す ということがやりたいのですが
例えば、native_program.hを
#pragma unmanaged
int func(int num){
return num*2;
}
のように書き、Form.hで
#include "native_program.h"
(中略)
int num2 = func(50);
(後略)
のように呼び出しても、マネージコードでは呼び出せませんのようなエラーが出て上手くいきません。
1つのプロジェクト内で、ネイティブコードも書きながら、#pragma unmanagedを使って
コンパイルするというのは無理なのでしょうか?
http://www.atmarkit.co.jp/fdotnet/special/vcppinvista01/vcppinvista01_02.html
ここにあるようにdll化して呼び出すということをしないとダメなのでしょうか。
これだとデバッグが大変なので、1つのプロジェクト内やりたいのですが・・・・

よろしくお願いします。

530デフォルトの名無しさん2012/06/27(水) 10:57:39.47
include ってそこに書いたのと同じ意味になるんだがそれはわかってる?

531デフォルトの名無しさん2012/06/27(水) 13:42:46.79
>>530
小一時間考え、
#include "native_program.h" の下に #pragma unmanaged を入れたら通りました・・・お騒がせしました

ところで、func()は実際はクラスの中に入ってるのですが、
呼び出し側では、
Classname* classname;
classname->func();
のようにすればOKなのでしょうか。この2行はマネージコードの中に入ってるけど
特にnewとかしなくても上の一行だけでクラスのオブジェクト作られてるのかなと・・・
というか、このように書いたら動いたのでOKなのかなと思ってるのですが。

532デフォルトの名無しさん2012/06/27(水) 13:43:46.48
失礼、#pragma managedです。。。
書き間違いました^^;

533デフォルトの名無しさん2012/06/27(水) 14:15:48.48
オブジェクトは無いだろう。
thisポインタがNULLのまま

534デフォルトの名無しさん2012/06/27(水) 14:23:15.98
オブジェクトはないけど動いている・・・
ということは、実行ファイルを直接読んでるということか・・・
よくわからないし動いてるので気にしないことにします^^;

失礼しましたw

535デフォルトの名無しさん2012/06/27(水) 14:24:02.48
>>531
Classname classname;
classname.func();
ならOK

536デフォルトの名無しさん2012/06/27(水) 14:50:42.50
まあ素直にstaticつけようぜ

537デフォルトの名無しさん2012/06/27(水) 15:05:30.83
なんで動いてるか気持ち悪かったのでやっぱりnewとdelete追加しときましたw

>>535
それだとコンパイルする人がエラー出しますね

>>536
やっぱ暗黙的に静的インスタンス?みたいなの作られてて、それのポインタになるんですかね
実体がなかったら動くわけないし。
デバッガでみたらポインタは未定義の値みたいになってましたけど

538デフォルトの名無しさん2012/06/27(水) 15:12:22.35
仮想関数じゃねーんだから、実体があるとかどうとか関係無い。
単に関数呼んでるだけだ、未定義のthisポインタでな。

539デフォルトの名無しさん2012/06/27(水) 15:24:21.57
>>537
>実体がなかったら動くわけないし
ところがCやC++では動く。
速度重視のため、安全確保のための自動チェックなどは行われない。
そしてメンバ変数に代入すると何処とも知れないメモリアドレスを書き換えて
所謂セキュリティホールになったりする。
メモリアクセス違反で強制終了するのはまだ良い方。

540デフォルトの名無しさん2012/06/27(水) 15:30:07.51
>>539
いあいあ、実体というか、どこかに機械語のコードがなかったら動くわけないですよね?
その場所がわからないとうか、管理されてないというかんじなのかな?
OSが管理してて、そのOSによるということなのかなあ

541デフォルトの名無しさん2012/06/27(水) 15:35:31.60
しったかしてるから初心者みたいな勘違いしたままなんだよ

542デフォルトの名無しさん2012/06/27(水) 15:36:54.37
>>540
まず「ヒープ」「スタック」「コードセグメント」あたりの
基礎から勉強すべき

543デフォルトの名無しさん2012/06/27(水) 15:44:18.84
C++/CLIってC++と.NET両方の知識がある人向けだから
そうでない人はC#でP/Invokeを使った方がいいと思う。

544デフォルトの名無しさん2012/06/28(木) 01:46:27.01
今更だけど、pragma managed も push pop できたと思うよ。

545デフォルトの名無しさん2012/06/28(木) 09:51:50.05
まあヘッダに入れてるしC++勉強始めて3日くらいの知識でC++/CLIとごっちゃで勉強すると
後で困ると思うがなあ

546デフォルトの名無しさん2012/07/03(火) 11:14:40.00
VisualC++の入門書を買って来たらC++/CLIの本だったのは良い思い出・・・

547デフォルトの名無しさん2012/07/03(火) 14:15:43.34
「シー教えてくれ」と言われ見たらC#

548デフォルトの名無しさん2012/07/04(水) 11:10:26.99
そのときの「シー」は半音上がってたんだろうw

549デフォルトの名無しさん2012/07/08(日) 14:06:13.60
>>548
うまいw

550デフォルトの名無しさん2012/07/13(金) 12:10:27.73
C++/CLI で暗黙のバッキングストア使うとき、get/setで異なるスコープにすることはできますか?
C# であれば public Hoge { get; protected set; } のような感じで。

ちなみに今使っているのはVS2008です。

551デフォルトの名無しさん2012/07/13(金) 21:51:43.58
出来るよ。

ref class Clazz
{
  property int XXX
  {
  private:
    void set(int iA);
  public:
    int get();
  }
};

552デフォルトの名無しさん2012/07/13(金) 22:09:27.40
>>551
ありがとー。
本体を書かなければ自動生成されるんですね。いわゆるWeekシンボルってやつかな。

>>550
× public Hoge { get; protected set; }
○ public int Hoge { get; protected set; }

553デフォルトの名無しさん2012/07/19(木) 19:16:48.08
XmlTextReaderでxmlファイルを読み込むとき,ファイルがあるかないかの判別はどうすればいいですか?

554デフォルトの名無しさん2012/07/19(木) 19:22:48.77
例外見ればいいだろ

5555532012/07/19(木) 19:31:55.14
msdnにあるFileNotFoundExceptionを使うのでしょうか?
使い方がいまいちわかりません・・・
恐縮ですができればサンプルコードを書いていただけませんか?
XmlTextReader^ reader = gcnew XmlTextReader( "sample.xml" );

556デフォルトの名無しさん2012/07/19(木) 21:32:34.53
XmlTextReaderのコンストラクタを直接触るのは非推奨
try { XmlReader^ reader = XmlReader.Create( "sample.xml" ); }
catch (FileNotFoundException^ ex) { Console::WriteLine("ファイルが見つかりません。"); }
C++/CLIは君みたいな人が足を踏み入れるようなもんじゃないし
頑張ったところで特にメリットもない
今すぐC#かネイティブのC++へ移行することを強くお勧めする

5575562012/07/19(木) 21:37:22.99
C#とごっちゃになってた
XmlReader::Createの間違い

5585532012/07/19(木) 22:01:25.04
>>556-557
ご回答ありがとうございます 助かりました
基礎ができていないのは痛感しております・・・
もしおすすめの参考書があれば教えていただけると幸いです・・・

559デフォルトの名無しさん2012/07/19(木) 22:11:53.24
悪いことは言わん
どうしてもC++/CLIを使わないといけないのなら、まずはC#を覚えるのが近道だ
C#なら入門者向けの書籍やサイトなどもいくらでもあるし、
C++/CLIの.NETの部分はC#もどきの劣化版にすぎない。

5605532012/07/20(金) 00:50:32.54
>>559
なるほど・・・
しかし今作っているプログラムを作り直す時間がありませんので
ひと段落してからC#の勉強をしたいと思います・・・
ありがとうございました.

561デフォルトの名無しさん2012/07/20(金) 10:49:26.48
なぁ、実際C++/CLIの利点て具体的にどうなの?
C++で作ったライブラリもユニコード使用でないとオーバーヘッドかかるし
.NET側にC++クラスのオブジェクトを入れるとポインタ使用になるし。
まぁ、パソコンも進化続けるから、アプリの重さも気にはなくなるだろうけど。

562デフォルトの名無しさん2012/07/20(金) 11:24:54.04
ホスト:アンマネージ、プラグイン:.NETの場合は、C++/CLIなしでやろうとすると
COMを経由してCLRをホストしたりとかクソ面倒臭い
.NETからC++のクラスを使いたい場合、C++/CLIではなくDllImportを使うとなると
いったんC向けのフラットなインターフェイスにラップしてやらないといけなくてクソ面倒臭い
どっちにしろC#とアンマネージC++を両方使う場合にのみ役に立つ

563デフォルトの名無しさん2012/08/02(木) 20:07:41.60
質問させて下さい。
visual studio 2005でC++/CLIを用いて開発を行なっています。
ref struct AA
{
 public:
  int a1;
}
refクラスの上記のような構造体を定義してそのオブジェクトを2つ作り、
AA a, aa;
a = aa;    (例なので初期化せずに代入しています)
とすると「error C2582; 'operator '=' 関数を 'AA' で使用できません」となってしまいます。
実際にはrefクラスの構造体を引数として渡したかったのですがC2664になってしまいビルドが通りませんでした。
そこで一番単純な構造体の代入コードを記述したところ、上記のようなエラーとなりあました。
いろいろ調べてみると、refクラスはコピーインスタンスとコピー代入演算子をデフォルトで自動生成しない
ということが原因かと考えたのですが対策が思いつきません。

refクラスの構造体の代入とコピーの方法をご教授いただければ幸いです。よろしくお願い致します。

564デフォルトの名無しさん2012/08/02(木) 20:16:58.19
で、値をコピーしたいの? 参照だけで良いの?
value struct AA じゃ駄目?
^は知ってる?

5655632012/08/04(土) 11:12:00.62
>>564
レスありがとうございます。
私の勉強不足のため、クラスライブラリ側の宣言はref structで宣言しないとダメだと思い込んでいました。
しかも、クラスライブラリ以外のプロジェクトでも同様の結果になるため、勝手に環境の説明を省いてしまいました。
申し訳ありません。
ご指摘の通り、value structにすることで解決できました。ありがとうございました。

566デフォルトの名無しさん2012/08/07(火) 23:03:24.56
PathCombainのstd::string版ってないですかね?

567デフォルトの名無しさん2012/08/09(木) 09:35:42.88
この本って古本で定価の倍でも買う価値あります?

実践C++/CLI 極めるための基礎と実用テクニック
http://www.amazon.co.jp/dp/4797336277/

最近、DirectXをWPFから呼び出す必要が出てきて……
でも、VS2012と.NET4.0が出たときに
新しい本がいろいろ出版されるような気もしますよね……

568デフォルトの名無しさん2012/08/09(木) 12:10:48.40
2012は4.5だ

569デフォルトの名無しさん2012/08/09(木) 18:33:32.45
>>567
SlimDXを使うか、読めば足りるんじゃないか。

570デフォルトの名無しさん2012/08/10(金) 10:02:39.92
使いたいDirectXの機能によっても代わるよなぁ

571デフォルトの名無しさん2012/08/10(金) 13:32:29.83
> マイクロソフトから、お客様のアプリケーションがたくさんの人々の目に触れ、
> 試用および購入されるのをサポートする、新しい特典をお知らせいたします。
> MSDN サブスクライバーであるお客様は、1 回のご購入で 12 か月有効な
> Windows ストアおよび Windows Phone の開発者アカウントを取得すること
> ができます。

AzureはVLで買っても契約期間分使えるのに(厳密にいうと少し違うが)、
これはVL(2or3年)で買ってると悲しいな。

572デフォルトの名無しさん2012/08/10(金) 13:34:07.44
テラ誤爆…サーセン

573デフォルトの名無しさん2012/08/10(金) 14:19:24.98

574デフォルトの名無しさん2012/08/11(土) 01:18:09.35
(;´д`)アアン

575すとら2012/08/14(火) 03:35:57.72
VS2010でフォームアプリの勉強をしています。
unmanagedクラスで別スレッドにて不定期で呼ばれる関数から、
managedなフォームの内容を変更したいと考えています。

下記のようにコーディングしましたが、stackoverflow(InvokeRequiredがずっとtrueのため)
で動きません。。どなたか適切な方法を教えていただけないですか?
1.managedなformメソッドとしてform編集メソッド作成
2.スレッドセーフにするためInvokeでラップ
 参考:http://blogs.yahoo.co.jp/fireis_myblood/25643271.html
3.delegate->Marshal::GetFunctionPointerForDelegate()でポインタ化
4.unmanagedの不定期呼び出され関数に2の関数ポインタを設定
5.実行

576デフォルトの名無しさん2012/08/14(火) 04:28:26.47
Marshal::GetFunctionPointerForDelegate の返り値を CreateThread の第四引数に渡して別スレッドから呼んでみたけど、
別スレッドからの呼び出しでは InvokeRequired は true になって、そこで Invoke した先では false になったよ。

577デフォルトの名無しさん2012/08/14(火) 04:34:54.96
たぶんやりたいのはこうだと思うんだけど、違うかな。

DWORD WINAPI proc(LPVOID param) {
typedef void (*fp_t)(void);
fp_t fp = reinterpret_cast<fp_t>(param);

for(int i = 0; i < 10; ++i) {
::Sleep(1000);
fp();
}
return 0;
}

public ref class Form1 : public System::Windows::Forms::Form
{
public:
Form1(void)
{
InitializeComponent();
IntPtr fp = Marshal::GetFunctionPointerForDelegate(gcnew MethodInvoker(this, &CppCli575::Form1::addText));
::CreateThread(NULL, 8192, proc, static_cast<LPVOID>(fp), 0, NULL);
}

void addText() {
if (textBox1->InvokeRequired) {
textBox1->Invoke(gcnew MethodInvoker(this, &CppCli575::Form1::addText));
return;
}
textBox1->Text += "A";
}

578デフォルトの名無しさん2012/08/14(火) 08:45:11.72
>>577
MethodInvoker^はメンバ変数に置いとかないと

579デフォルトの名無しさん2012/08/14(火) 10:12:04.44
日本人は マスコミ電波で動く ロボット人間

日本人は、先進諸国で飛び抜けてマスコミ報道を鵜呑みに
信じやすいことがこの動画で実証されています。

いわばマスコミ報道の「鵜呑度」を国際比較すると、
日本人は、先進国中ダントツに「鵜呑度」が高く70%、
最も低い国民は英国で14%です。
その他の主要欧米諸国(ロシアを含め)は20−35%です。
日本に近い国は、ナイジェリア、中国など、途上国と新興国となります。

別の言い方をすれば、日本人の70%は、
自分の頭で考えず(思考停止)、
テレビ、新聞、週刊誌などのマスコミの情報を鵜呑みにしていることを意味します。
青山は以前からこれを「観客民主主義」と言っています。
観客民主主義は、マスコ ミの情報操作による世論誘導に最も陥りやすく、
独裁にも呼応しやすい特性を持っています。

マスコミ報道「鵜呑度」
日本人70%、英国人14% You Tube
http://www.youtube.com/watch?v=ypPqsWUC6Vo

http://www.asyura2.com/12/senkyo132/msg/578.html

580デフォルトの名無しさん2012/08/14(火) 12:21:37.43
>578
たしかにGCされるとだめですね。フォローどうも。

5815752012/08/15(水) 03:56:45.46
>> 576-577
ありがとうございます。
実装してみたところ、確かに望みの動作をしました!!

なぜ自分のコードが動かないか突き止めるために
教えていただいたコードを変更していますが、別の問題にもつまづきました。。
申し訳ないですがもう少し教えてください。

<当面の問題:うまくコンパイルできない>
関数procを、クラス内のstaticメソッドに変更しようとした(下記)。
#コンパイル時に、未解決のトークン (0A000043) "public: static void (__cdecl* test2ch::Testproc::fp)(void)"とのエラーが発生。
class Testproc
{
typedef void (*fp_t)(void);
static fp_t fp;
public:
Testproc(LPVOID func)
{
fp = reinterpret_cast<fp_t>(func);
::CreateThread(NULL, 8192, (LPTHREAD_START_ROUTINE)Testproc::proc1, this, 0, NULL);
}

DWORD static WINAPI proc1(void)
{
for (int i = 0; i<10; ++i){
::Sleep(1000);
Testproc::fp();
}
return 0;
}
};

5825752012/08/15(水) 04:00:38.88
連投すみません。
ちなみに、元の問題の原因究明のために今後確認したいことは

(staticメソッドでラッパした)インスタンスメソッドとしてproc1()を定義し、
proc1()内ではstaticではない関数ポインタfpを実行するように変更して
スレッドを実行して所望の動作(formが変更できる)かどうかを確認

です。

583デフォルトの名無しさん2012/08/15(水) 21:02:13.28
>>581
C++/CLIじゃなくてただのC++の話だな。
static fp_t fp;
これの実体を定義していないだろ?

5845752012/08/15(水) 21:19:41.78
>>583
お恥ずかしい限りです・・・
ご指摘ありがとうございました。
581の問題は解決しました。

585デフォルトの名無しさん2012/10/18(木) 17:07:44.86
コンパイルが通りません
教えて下さい

ref class Test
{
bool& Bl;

Test(bool& bl)
{
Bl = bl;
}
};


586デフォルトの名無しさん2012/10/18(木) 17:11:57.85
Test(bool& bl):Bl(bl){
}

587デフォルトの名無しさん2012/10/18(木) 17:30:32.24
>>586
コンパイルが通りました
ありがとうございました

588デフォルトの名無しさん2012/10/25(木) 19:29:47.52
画面周りだけCLI使ってそこから呼び出すのはPUREなC++にしている

589デフォルトの名無しさん2012/10/25(木) 23:09:06.37
最初はそういう使い方してたけど
最近はp/invokeがあるからC#で別段問題ない

590デフォルトの名無しさん2012/10/29(月) 12:21:58.58
最初から/CXの構想で作れなかったのかねえ

591デフォルトの名無しさん2012/10/29(月) 15:20:01.15
>>588→画面をC#にしたら簡単すぎワロタ→内部もC#にしても速度変わんなかった→もうC#だけでいいや

592デフォルトの名無しさん2012/10/29(月) 22:32:04.19
既存のC++のライブラリがある場合はC#から呼び出しまくると速度ゲロ重

593デフォルトの名無しさん2012/10/30(火) 00:03:22.69
C++/CLIから呼んでもC#から呼んでも速度は変わらんよ
C++のライブラリはC#だとラップするのがゲロ面倒だから、その点ではC++/CLIが有利
でも本当に速度を求めるんなら、C++/CLIでもC#でも細かくネイティブコードを呼ばないで
必要なデータをまとめて受け渡しするようにして、
細かいところは全部ネイティブコードで書いてしまうのがいい

594デフォルトの名無しさん2012/10/30(火) 00:11:42.83
>C++/CLIから呼んでもC#から呼んでも速度は変わらんよ
C++ InteropはP/Invokeより高速だよ
http://msdn.microsoft.com/ja-jp/library/ky8kkddw%28VS.80%29.aspx

他のところは同意。まとまった単位でネイティブに切り出さないと高速化の恩恵は薄い。下手するとC#より遅くなる。

595デフォルトの名無しさん2012/10/30(火) 00:28:06.09
変なマーシャリングしないようにすればC#のDllImportでもそんなに遅くはならないよ
アプリに即した形でまとめてネイティブコードで処理、を突き詰めると
結局C++(not CLI)とC#でいいんだよなあ

596デフォルトの名無しさん2012/10/31(水) 01:02:26.73
C++/CLIはビルドが遅いから糞

597デフォルトの名無しさん2012/10/31(水) 04:22:13.18
必要に迫られて仕方なく使うもんですし

598デフォルトの名無しさん2012/10/31(水) 20:11:20.60
マネージドからアンマネージドの処理を制御するのはいいんだけど
アンマネージドからマネージドに通知したい時どうしようか悩む

599デフォルトの名無しさん2012/10/31(水) 21:21:47.37
gcrootで余裕
C#とDllImportだと参照管理がかなり面倒

600デフォルトの名無しさん2012/11/01(木) 07:39:47.26
C++/CXもここでいいの?
βでもあったし環境依存みたいだが、VS2012 for Windows8で
ターゲットwin32の時に出るコンパイルエラー対策を自分用にメモっとく

インクルードディレクトリに追加 ;$(WindowsSDK_IncludePath);
ライブラリディレクトリに追加 ;$(WindowsSDK_LibraryPath_X86);

601デフォルトの名無しさん2012/11/01(木) 09:24:06.16
>C++/CXもここでいいの?

全然別ものなので違います

602デフォルトの名無しさん2012/11/01(木) 10:02:20.29
/CXも/CLIと同様に、GUI作るのに使おうとする勘違い君がたくさん出てくるんだろうな
このスレに溢れるC++/CLIに対するネガティブな意見はほとんど/CXにも当てはまる

603デフォルトの名無しさん2012/11/01(木) 12:16:56.17
そう? ストア用アプリ開発をC++でやりたいって人に
思い留まらせるような要素は、C++/CXの環境には無いと思うけど

604デフォルトの名無しさん2012/11/01(木) 13:09:28.96
説明するだけ無駄な気はするけど、

WinMDのおかげでDllImportの手間が消えて、呼び出しコストが減って、C++製のネイティブコードを対象にしたリフレクションすら使えるようになった。
これだけ扱いやすくなってくれると高速化のために部分的に利用するってのも十分いける。
C++ AMPとか面白げな物もあるしね。
(C++やC#製のライブラリがJavaScriptからも簡単に呼び出せるので、UIをHTML5とJSで作る人が増えそう)

C++を使いこなせるならC#覚えるのは簡単。
C++が使えてもWinRT部分は全部0から覚えなおし
GUI作るのに何倍も時間がかかるわりには、同じライブラリ使っているため体感速度に差がない。
それならC#覚えて、重い処理のとこだけC++でやればいい。(HTML5+JSでもいいけど)

この辺の事情からC++/CXもC++/CLIと同様にGUIを作るためのものではないと断言する。
これだけ言われてもC++/CXだけでやりたいって言うなら止めないけど、どこまで行っても茨の道だぞ

605デフォルトの名無しさん2012/11/01(木) 16:58:40.48
GUIはともかくDirectX使う場合はC++/CXになりそうだがXNAないし

606デフォルトの名無しさん2012/11/01(木) 17:50:29.07
>>604
うーん、説明されても無駄だったなあ
C++/CXのデメリットの部分が抽象的でピンとこないや

WinMDちゅーても既存のネイティブライブラリをC#アプリにマージしようとしたら
結局ラッパークラス書かなきゃならないわけで
C++/CLI時代なら、ラッパークラスの作業量が多くなり過ぎるくらいなら
インターフェイスの粒度を洗いなおしてもうDllImportにしちまえよってことになるけど
C++/CXはそのまま全部に使うっ選択肢もありだとおもうけどね


607デフォルトの名無しさん2012/11/01(木) 18:03:13.80
>>605
DirectXはCX拡張使わずに普通のC++で使えるからC++/CX関係ない
設定画面などで少しだけOSネイティブのUIを使いたいときだけほんのちょっとCX使うくらいだろ
>>604
考え方が逆だと思う
これまでの.NETでは、C#からDllImportでC++を呼び出すのは簡単でもその逆は難しい
だからそこを補助するのにC++/CLIは有効
WinRTでは、C++からCXを使ってC#やWinJSで書かれたコンポーネントを呼び出す
ということが簡単に行えるから、既存のC++コードを他言語から
呼び出すためのラッパーなんて書かなくていいの
新規に作ったC#やJSのコンポーネントをC++から呼び出せばいい

608デフォルトの名無しさん2012/11/01(木) 18:16:29.83
まぁ、どっちの使い方も出来るんだから好きなようにやりゃいいさ

609デフォルトの名無しさん2012/11/01(木) 18:37:36.69
むしろC++/CXで呼び出せるデスクトップ用GUIライブラリが欲しかった…

C++/CLIはcli上にネイティブ用マーシャリングコードの生成だったけど
C++/CXはネイティブ上にCOM/WinRT用マーシャリングコードの生成なんんだよね確か

つまりObjCのパk(ry

610デフォルトの名無しさん2012/11/01(木) 18:53:57.94
パコパコ

611デフォルトの名無しさん2012/11/01(木) 21:43:12.40
問題はMSが途中で放り投げないのはどれかということだよ

612デフォルトの名無しさん2012/11/01(木) 21:57:19.02
C++資産の活用という目的があるから/CLIも/CXも無くなることはないだろうけど
/CXも/CLIみたいにIDEサポートがなおざりになっていく可能性が高いな
/CLIも誕生当初は.NET開発の本命とか言われてたんだし

613デフォルトの名無しさん2012/11/01(木) 22:01:57.86
全部放り投げて新たな言語開発したりしてw

614デフォルトの名無しさん2012/11/01(木) 22:12:33.37
MSって実験的な技術でも最初から気合入れてしっかり使えるものを出してくるから厄介なんだよね
新技術出してすぐ放り投げるのはGoogleのほうがよっぽど酷いけど
あっちは一目見て「ああこれダメだわ」とわかるからな

615デフォルトの名無しさん2012/11/18(日) 18:32:24.63
hackとproductの文化的な違いでしょ
MSのは、OSSのフリーライダーに仕方なく合わせてきた感がタップリ
過去の因縁からしてMSの製品は使わないといった派閥は今日でも現存する

616デフォルトの名無しさん2012/11/23(金) 09:55:41.06
共産主義の理想はOSSのみが実現できる

617デフォルトの名無しさん2012/11/23(金) 09:57:46.75
OSSと共産主義が関連あるのは本当?FSFじゃなくて?

618 ◆QZaw55cn4c 2012/11/23(金) 13:01:21.23
>>617
共産主義の定義による、スターリン以前か以後かどっち?

619デフォルトの名無しさん2012/11/23(金) 18:05:53.27
C++で作られた.LIBなファイルをC++/CLIから呼び出すには何か注意点ありまか?

いま、ビルドはできるけどランタイムの初期化?で落ちてしまいます

620デフォルトの名無しさん2012/11/23(金) 23:14:32.20
visual studio でc++ やってるけど

#include "stdafx.h"
#include "stdio.h"
#using <System.Dll>
#using <System.Data.Dll>
#using <System.Xml.Dll>
#include <string>

using namespace System;
using namespace System::Data;
using namespace System::Xml;
using namespace System::Collections;
using namespace System::Data::SqlClient;

int main(void)
{
String^ str;
String^ str200;

char* comp[100] ;
SqlConnection^ Conn = gcnew SqlConnection("Password=apple;User ID=sa;Initial Catalog=master200;Data Source=.\\sql2031");
Conn->Open();
int t;
str = "Select * FROM Customers";
SqlCommand^ sqlCmd = gcnew SqlCommand(str,Conn);//
SqlDataReader^ dr= sqlCmd->ExecuteReader ();
while( dr->Read() )
{   str200=dr["CompanyName"]->ToString();
comp[t] = (char*)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(str200).ToPointer();
こっから 表示ができない。
printf("<TD><input type='text' name='comp' size='30' value='"+comp[t]+"' ></TD>" );

621デフォルトの名無しさん2012/11/23(金) 23:16:25.59
システム ストリング から苦労して
char* 変換できたけど
どうやってstringf できるか教えてほしい。

622デフォルトの名無しさん2012/11/24(土) 09:22:28.68
あっさりできました。

printfやめたるだけだった。

Console::Write("<TD><input type='text' name='comp' size='30' style='background: #fafad2; font-weight: bold ;' value='"+dr["CompanyName"]+"' ></TD>" );


ストリング変換とかキャラ変換とか一切不要でした。

623デフォルトの名無しさん2012/11/24(土) 10:22:23.19
>>622
死ね

624デフォルトの名無しさん2012/11/24(土) 11:28:11.23
>>623

なんでそういうこというんですか?

私はあなたが、ガソリンをかぶって、
火をつけて焼身自殺することを望みます。

2ちゃんねる ニュース板+で

焼身自殺した人のニュースみたら、凄い悲しみます。

でも後悔はしないです。

625デフォルトの名無しさん2012/11/24(土) 22:00:38.23
内閣府は24日、「外交に関する世論調査」結果を発表した。
中国に「親しみを感じない」と答えた人の割合は2011年の前回調査比9・2ポイント増の80・6%で、
1975年の調査開始以降で最高となった。
韓国に「親しみを感じない」という人も23・7ポイント増の59%と急増し、過去2番目に高い数字となった。
外務省は「尖閣諸島(沖縄県)や竹島(島根県)をめぐる対立が、中国や韓国に対する国民感情の悪化につながった」と分析している。

 調査は9月27日〜10月7日にかけ、全国の成人男女3000人を対象に行い、1838人(61・3%)が回答した。

 日中関係が「良好だと思わない」との回答は16・5ポイント増の92・8%、
日韓関係が「良好だと思わない」も42・8ポイント増の78・8%に達し、ともに過去最高となった。

 中国との関係では、今年9月の尖閣諸島国有化をきっかけに中国各地で反日デモが相次ぎ、
現地の日系企業が焼き打ちや略奪に遭ったことなどが影響したとみられる。
「韓流ブーム」などを通じ近年は良好だった韓国との関係についても、
今年8月の韓国の李明博(イミョンバク)大統領による竹島上陸が「冷や水」を浴びせた格好だ。

http://www.yomiuri.co.jp/national/news/20121124-OYT1T00811.htm?from=ylist

626デフォルトの名無しさん2012/11/25(日) 15:24:56.72
C++/CLIのクラスライブラリのプロジェクトが2つ(AとB)あります。
BはAを使うので、Bのプロジェクトの設定でAを参照するようにしています。
Aのビルドは問題なくできますが、Bをビルドすると
 LNK2020: 未解決のトークン (06000022) <Aにあるクラスの静的メソッド名>
と言われます。
何か他に設定が必要でしょうか。教えてください。

627デフォルトの名無しさん2012/11/25(日) 15:46:03.82
http://msdn.microsoft.com/ja-jp/library/b57tw91b(v=vs.80).aspx

このエラーを解決するには、次のどちらかの操作を実行します。

欠けている関数またはデータを定義します。

欠けている関数またはデータが既に定義されているオブジェクト ファイルあるいはライブラリを取り込みます。

628デフォルトの名無しさん2012/11/26(月) 22:01:25.29
C++でのオブザーバーパターンの実装例を教えていただけますでしょうか
色々検索したのですが見つかりませんでした

629デフォルトの名無しさん2012/11/26(月) 22:05:15.44
C++/CLIならそんなもん要らん。言語に組み込まれている。
イベントを使え。

630デフォルトの名無しさん2012/11/26(月) 22:10:44.54
オブザーバーパターンの実装が分からんとか
さすがにC++/CLIを使う資格がないと言わざるを得ない
C#かC++からやれ

631デフォルトの名無しさん2012/11/26(月) 22:35:48.50
obsecureですね
わかります

632デフォルトの名無しさん2012/11/28(水) 21:17:29.45
C++/CLIみたいな方言をやる意味あるのか?

633デフォルトの名無しさん2012/11/28(水) 22:48:53.31
しがらみってもんがあってな

634デフォルトの名無しさん2012/11/28(水) 23:56:16.87
2012で..netのウィンドウがある普通のアプリが
作れなくなったのだったか?

635デフォルトの名無しさん2012/11/28(水) 23:58:00.13
プロジェクトテンプレートが無くなっただけで、WinFormsの項目テンプレートはある
MSとしてはフェードアウトさせたいんだろうな

636デフォルトの名無しさん2013/01/27(日) 04:17:32.21
C++/CLI勉強中なんですけど、なんでpropertyで2回以上も型を書かせるのはなんで?
property System::Collections::Generic::IEnumerable<System::String^>^ Kuso
{
  System::Collections::Generic::IEnumerable<System::String^>^ get();
  void set(System::Collections::Generic::IEnumerable<System::String^>^ value);
}
と書くのは気が狂うんですけど。それぞれの型が異なることってあるの?↓でいいじゃん。
property System::Collections::Generic::IEnumerable<System::String^>^ Kuso
{
  auto get();
  void set(auto value);
}

てかこのスレ2ヶ月間も書き込みがないってどういうことなの。あっ…(察し

637デフォルトの名無しさん2013/01/27(日) 09:57:28.12
便利に普通に使う言語じゃねえからなこれ
たかが.NETとネイティブコードを橋渡しする非標準拡張のために
必要以上に言語に手を入れたくなかったんだろ

638デフォルトの名無しさん2013/01/27(日) 15:02:59.86
printf("%x", data);
すると
出力が
ffffff93

ffffff94
などになるdataという名前の変数に対して演算をして
結果をdata2に格納し、

printf("%x", data2);
の出力が必ず
ffffff90
になるようにしたい
(16進数表示した時の下一桁以外は変えず、下一桁だけを必ず0にしたい)のですが、
dataに対してどのような演算を行えばよいでしょうか。

639デフォルトの名無しさん2013/01/27(日) 15:40:23.86
>>638
ビット演算でANDする。

640デフォルトの名無しさん2013/01/27(日) 17:35:27.93
>636
typedefという便利な機能があってのう…(しかし名前空間が汚染される)

641デフォルトの名無しさん2013/01/27(日) 17:58:33.08
マクロの出番だよ、マクロの出番

642デフォルトの名無しさん2013/01/28(月) 15:00:14.29
C++、C#どっちもできて、C++でGUIを簡単に作りたいっていうのには向いてるよね
SDKがC++でもC#どちらでも使えるし、守備範囲が広い
ただその為に変数の型変換とかちょっとめんどくさいこと調べないといけないけど

643デフォルトの名無しさん2013/01/31(木) 00:50:44.45
酷い釣りだ…C++に見えてその実全く違う言語じゃねぇか。

644デフォルトの名無しさん2013/01/31(木) 07:09:42.74
顧客が本当に望んでいたもの: デスクトップ向けC++/CX

645デフォルトの名無しさん2013/01/31(木) 08:33:51.13
>>643
いや両方とも使える
逆に言うと2つの言語を覚えてる気分になるかもしれん

646デフォルトの名無しさん2013/02/20(水) 15:07:47.77
//homepage3.nifty.com/ishidate/vcpp10_g8/vcpp10_g8.html
このHPを見て勉強しているんですが
「グローバルに下記を設定しておく。」の範囲ってどこからどこまででしょうか?

647デフォルトの名無しさん2013/02/20(水) 15:11:06.36
htm じゃないか

648デフォルトの名無しさん2013/02/20(水) 15:15:14.41
>>647
あ、すいませんhtmでした
//homepage3.nifty.com/ishidate/vcpp10_g8/vcpp10_g8.htmです

649デフォルトの名無しさん2013/02/20(水) 15:26:26.90
staticなんだし適当にやってみりゃよかろう
WIDTHとHEIGHTはどこでもいいしarray部分はclass Form1に入れたら
とりあえず動いたぞ、面白いなこれw

650デフォルトの名無しさん2013/02/20(水) 15:33:46.31
何の役に立つのかな

651デフォルトの名無しさん2013/02/20(水) 15:34:48.07
>>649
自分やると動かないんですけど・・・
何で動かないんだ?

652デフォルトの名無しさん2013/02/20(水) 15:38:18.30
エスパー希望ですねわかります

653デフォルトの名無しさん2013/02/20(水) 15:54:18.59
うまくいかないのは実行時なのかコンパイル時なのか
うまくいかないと判断したのはどこ?

654デフォルトの名無しさん2013/02/20(水) 17:02:18.31
初心者なので…すいません
実行するとエラー100いくつとかはくんですよね
範囲設定間違ってるのか、何が原因なのかわかんないです。。。

655デフォルトの名無しさん2013/02/20(水) 17:07:17.35
100いくつって数かよ
もしそうならコンパイル時だろうし
全角スペース入ったままなんだろ
置換で半角に変えとけ

656デフォルトの名無しさん2013/02/20(水) 17:26:40.56
全角→半角やってもダメみたいです…
もし成功した方いたらそのプロジェクトファイルうpしていただけませんか?
どなたかお願いしますううう

657デフォルトの名無しさん2013/02/20(水) 17:30:18.61
ダメみたいとか、自分の状況を隠し続ける人に言えることは何もない

658デフォルトの名無しさん2013/04/17(水) 21:57:33.57
等高線グラフを表示させたいのですが、
手段が見つかりません。

3D点(x,y,z)の点(データ)×数万個を線で結びつけて、色付けしたものです。

チャートコントロール(mschar)では等高線をサポートしておらず、実現できません。
System::Windows::Forms::DataVisualization::Charting::Chart

どなたかご教授くださいませ!

[環境]
visual c++ 2008 express
vs2012へ更新検討中

659デフォルトの名無しさん2013/04/17(水) 22:02:56.86
そういうのは可視化ツール使えよ
ParaViewとか

660デフォルトの名無しさん2013/04/17(水) 22:10:53.92
Gnuplotでも使えば一瞬
自分でそういうの書くのは手段が目的化してるバカ

661デフォルトの名無しさん2013/04/17(水) 23:21:24.73
マルチ

662デフォルトの名無しさん2013/06/01(土) 08:15:06.30
ちょっと教えてください
自分は独学でC/C++,C#と、まぁC系の勉強をして、ソフトも作れるようにもなりました。
で、就職活動してたんですが、年齢のせいで、資格か業務経験が無いとって感じで、どの企業にもスルーされてきました。
で、今、職業訓練学校でJAVA及びAndroidアプリの作製っていうコースにかよってて
さすがに、まぁ、昔、独習JAVAって本でさらっとJAVAを勉強してた部分もあったりでJAVA自体は
勉強するというより(現在は、まだAndroid開発の講義じゃなくてJAVAの講義)今の、講師からも言われたんですが
「〜(自分)さんは、もうJAVAの部分は解かってるだろうから、色々と予習していったら良いですよ。」と言われてる状態です。
さて、ここからが本題ですが、JAVAのソースを見てるとnativeっていう修飾子があって文字通りnativeで作られた
メソッドがあったんです。で、JAVAのVMもどうやらCで書かれてるようなのがソース見てわかりました。
そしてCLIですが、C++で組んだアンマナージドなクラスライブラリ等をC#で使う時ってなんかしらの修飾子
ってあるんですか?一度実験でアンマネージドなC++のクラス作ってマネージド(CLI)なクラスの中にほりこんだら
[そりゃ無理じゃ、ポインタとして宣言しろ!このカスが!]って嘘だけど、まぁ、こんな感じのエラーがでたんです。
C#側でwin32apiを使いったかったらdllのアトリビュート文を書けば良いんですけど
クラスはどうしたら良いんでしょうか。
どなたかこうすれば良いという方法があればご教示ください。

663デフォルトの名無しさん2013/06/01(土) 09:35:33.80
文章にイラン部分が多すぎ。人生相談の板は別にあるぞ
質問は的確に

6646622013/06/01(土) 10:22:22.81
>>663
そやね、確かに質問がまとまってなかったは。
要は、普通にC++でクラスを作ります(例えばTestっていうクラス)。
それをC#内で使おうと思っても、無理になります。
で、その仲介役としてCLIを使うとします。
その時にCLIで作ったマネージドなクラス内でTestクラスのインスタンスを生成するには
どうしたら良いですか。という質問です。

665デフォルトの名無しさん2013/06/01(土) 11:56:57.18
>>664
C++のクラスをCOMコンポーネントにする
これで直接C#内で使えるだろ

666デフォルトの名無しさん2013/06/01(土) 12:11:21.91
gcnew じゃなくて new してポインタを受けるだけじゃうまくいかなかったのか?

ちなみにマネージドとアンマネージドの世界の行ったり来たりはオーバーヘッドすごいから
小さなメソッドをちまちま呼び出すような処理はやめておけ。

6676622013/06/01(土) 12:13:59.07
>>665
あ、そっか、たしかにCOMコンポーネントは呼べるね。
でも、C#で以前(何年前かは忘れた)Excel呼び出して
C#側で、Excel終了さしたのにプロセス見たら
残ってて、こりゃあかんと思ってExcel呼び出すのは
やめたんだけど、今のVSは、そこらへんもちゃんとしょりしてるのかな
俺がもってるVSって2005なんでね

668デフォルトの名無しさん2013/06/01(土) 12:22:18.97
>>667
ぼろいPCならアプリ終了しても暫くプロセス残ってるなんて普通にあると思うが

669デフォルトの名無しさん2013/06/01(土) 14:37:10.11
COMの場合それとは違って寿命管理の話だな

670デフォルトの名無しさん2013/06/01(土) 14:39:16.16
>>664
C++/CLIのマネージドクラス内でインスタンスを生成して
「フィールドに保持したい」ということでいいのか

フィールドをポインタにしてnewして持てばいい

671デフォルトの名無しさん2013/06/02(日) 00:02:02.93
こんなかんじかな、Disposableにしてるから
deleteのタイミングが重要なときはDisposeすればよい

ref class M2 {
N1 *n;
public:
M2() { n = new N1; }
~M2() { delete n; }
!M2() { delete n; }
};

672デフォルトの名無しさん2013/06/02(日) 10:25:59.95
CLI用スマポを作る

673デフォルトの名無しさん2013/06/02(日) 12:55:57.74
>>667
多少スレ違いだけど、それの解決方法はほぼ確立してるんだ。
結局のところ外部プロセスサーバーが終了する前に
Execl.Appicationを何度も生成からそうなるわけで、
はじめからExecl.Appicationをひとつだけ生成しておくか、
WeakReferenceにExecl.Appicationの参照をもって、
参照が消えてれば生成するというロジックにすれば万事解決する。
連続して使うときはExcelのインスタンスが毎回立ち上がらずに
パフォーマンスがいい。

674デフォルトの名無しさん2013/06/02(日) 13:08:52.90
そうだね

675デフォルトの名無しさん2013/06/02(日) 14:57:18.85
>>667
似たような経験があるけど、そのときは、単に参照を破棄してもGCされるまでは
オブジェクトが解放されないからCOMサーバーに伝わらんだけだった。
そういうことじゃなくて?

676デフォルトの名無しさん2013/06/02(日) 15:17:26.36
俺も経験ある
GCされるまで開放されないんだよねあれ

677デフォルトの名無しさん2013/06/02(日) 19:34:42.29
馬鹿には無理

678デフォルトの名無しさん2013/06/02(日) 21:35:27.92
ReleaseComObjectは現実的な対処法ではないだろう。
ある程度の規模のコードで、例外時も含めて漏れなく書くとなると
コード量が膨らみすぎる。

679デフォルトの名無しさん2013/06/17(月) 19:39:26.55
.Net Framework 2.0のUdpClientクラスって、recvfromに該当するものってないのかな?
相手のIPアドレスが知りたいんだけども。

同じポートに複数のスレッドがブロードキャストしてて、片側のパケットだけを対象にしたい
のよね。

680デフォルトの名無しさん2013/06/17(月) 22:44:18.60
Connectすればいいよ

6816792013/06/18(火) 12:48:05.81
自己解決した。

ひとまず、EndRecieveの引数にIPEndPoint仕掛けてやればいいっぽ。
そしたらStringで判定できる。

682デフォルトの名無しさん2013/06/18(火) 13:06:09.51
>>679
recvfrom の仕様は分からないけど、送信元のアドレスは UdpClient.Receive
の引数で取れるよ。
非同期なら UdpClient.EndReceive の第2引数。
見当違いだったらごめん。

6836822013/06/18(火) 13:07:11.20
リロード忘れたorz

6846792013/06/18(火) 15:35:49.41
>>682
うん、後者でやることにしたんだわ

685デフォルトの名無しさん2013/06/18(火) 15:44:15.55
リロード忘れたの意味がわからない人か

686デフォルトの名無しさん2013/06/18(火) 16:31:15.38
わかってるから優しくフォローしたように見えるけど。
世の中難しいね!

687デフォルトの名無しさん2013/07/03(水) NY:AN:NY.AN
配列初期化時に値も設定したのですが、gcnew array<int>(3){1,2,3};
って書かないとコンパイラさんにはじかれます。
gcnew array<int>(){1,2,3};
みたいな、配列サイズを指定しない初期化方法は無いでしょうか。

688デフォルトの名無しさん2013/07/03(水) NY:AN:NY.AN
()書かない

689デフォルトの名無しさん2013/07/03(水) NY:AN:NY.AN
本当だ!!<>のあとに{}を書くっていう発想がなかったです。
ありがとうございました。

690デフォルトの名無しさん2013/07/15(月) NY:AN:NY.AN
C++/CLIで使えるロギングライブラリってどういうのがあるんでしょう?
.netで用意されているのか、あるいはlog4cppなんかのC++用の
ライブラリを使ったりしているんでしょうか。

691デフォルトの名無しさん2013/07/15(月) NY:AN:NY.AN
log4netとか

692デフォルトの名無しさん2013/07/15(月) NY:AN:NY.AN
なるほど、見落としていました。
log4netは名前を見たことはあったんですが、「C#で使うもの」と
刷り込まれて、すっかり頭から抜けていました。

693デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
listBox1->Items->Add("A");
これがOKで
std::string a = "A";
listBox1->Items->Add(a.c_str());
これだと'const char *' から 'System::Object ^' に変換できないって出るんだけどどういうこと?
最近CLIさわりはじめたんだけどわからん・・・

694デフォルトの名無しさん2013/07/17(水) NY:AN:NY.AN
リテラルの文字列は文脈によってString^として扱えるってだけ
char*やwchar_t*とString^は別物
char*からならgcnew Stringしたりとか

695デフォルトの名無しさん2013/07/18(木) NY:AN:NY.AN
>>694
とんくす

696デフォルトの名無しさん2013/07/22(月) NY:AN:NY.AN
>>679
これ自分も試してるんだがうまくいかん。
EndReceivedの第二引数の中みても"255.255.255.255"で見分けがつかない。

後でコード載せますん。

697デフォルトの名無しさん2013/07/22(月) NY:AN:NY.AN
コードっす(1/2)。"192.168.3.128"からのUDPブロードキャストのみを対象にしたいっす。
--------
#pragma endregion
private:
System::Void btnUdpRecv_Click(System::Object^ sender, System::EventArgs^ e)
{
String^ FilterIPAddress = L"255.255.255.255";
// Receive a message and write it to the console.
int portID = 3000;
IPEndPoint^ ipep = gcnew IPEndPoint(IPAddress::Any, portID);
UdpClient^ udpcli = gcnew UdpClient(ipep);

UdpState^ udpst = gcnew UdpState();
udpst->e = ipep;
udpst->u = udpcli;

udpst->u->Connect(FilterIPAddress, portID);
this->btnUdpRecv->Enabled = false;

Console::WriteLine("listening to RT");
udpcli->BeginReceive(gcnew AsyncCallback(this, &UDP_RECVTEST::Form1::ReceiveCallback), udpst);

// Do some work while we wait for a Packet. For this example,
// we'll just sleep
while (!messageReceived)
{
System::Threading::Thread::Sleep(100);
}

this->btnUdpRecv->Enabled = true;
}

698デフォルトの名無しさん2013/07/22(月) NY:AN:NY.AN
続きっす(2/2)。
--------
//Call back function for the read packet data
System::Void UDP_RECVTEST::Form1::ReceiveCallback(IAsyncResult^ ar)
{
String^ FilterIPAddress = "192.168.3.128";

UdpState^ state = (UdpState^)ar->AsyncState;
UdpClient^ udpcli = state->u;
IPEndPoint^ ipep = state->e;

EndPoint^ remoteep = udpcli->Client->RemoteEndPoint;

int len = udpcli->Client->EndReceive(ar);
String^ recvip = ipep->Address->Broadcast->ToString();

if(ipep->Address->Broadcast->ToString() == FilterIPAddress)
{
array<unsigned char>^ receiveBytes = udpcli->EndReceive(ar, ipep); //Packet received

Console::WriteLine("Received packet length {0}", receiveBytes->Length);
messageReceived = true;

return;
}

Console::WriteLine("listening to RT");
udpcli->BeginReceive(gcnew AsyncCallback(this, &UDP_RECVTEST::Form1::ReceiveCallback), state);
}

699デフォルトの名無しさん2013/07/22(月) NY:AN:NY.AN
以下、簡単に説明。

プロジェクトはWindowsフォームアプリケーションです。フォームにボタンを配置して
クリックしたら"btnUdpRecv_Click"がうごくという簡単なもの。

あと、UDPブロードキャスト送信側は、inet_addr("255.255.255.255")で送信しております
です。

なにかヒントでもありましたらご教示くださいませ。

700デフォルトの名無しさん2013/07/22(月) NY:AN:NY.AN
EndReceiveの第二引数かいてないのはいろいろ試してそれでもだめだったんで
一回もと(というか、チャレンジする前)に戻したためです。ご了承くだ。

701デフォルトの名無しさん2013/07/22(月) NY:AN:NY.AN
なんでEndReceive二回よんでんの?

702デフォルトの名無しさん2013/07/22(月) NY:AN:NY.AN
そう!すいませんアホなことしてましたアンド紛らわしい変数名つけてたんで違うほうみてた…
お騒がせしますた!

703デフォルトの名無しさん2013/07/24(水) NY:AN:NY.AN
スレッドを立てたいんだけど、
HANDLE ThreadHandle = (HANDLE)_beginthreadex(NULL, 0, ReadThread, NULL, 0, NULL);
unsigned __stdcall ReadThread(void *p){}
こうすると関数呼び出しには引数リストが無いからメンバーへのポインタを作成するために
&Namespace::ReadThreadって感じで指定しろって言われたからそうしたら今度は
delegate インスタンスを作成する場合以外に&Namespace::ReadThreadのアドレスを指定できないとか言われて八方塞なんだけどどうしたらええの・・・

704デフォルトの名無しさん2013/07/24(水) NY:AN:NY.AN
いっそ、CreateThread

705 ◆QZaw55cn4c 2013/07/24(水) NY:AN:NY.AN
_biginthread ってなんで必要なんだ?
CreateThread で十分用がたりるのだが?
というか cygwin/gcc-3 なんでこれしか選択肢がない

706デフォルトの名無しさん2013/07/25(木) NY:AN:NY.AN
_beginthreadも結局は内部でCreateThreadを呼び出しているのではあるが
そのほかにランタイムが使う内部変数の初期化なども行っている

よっていきなりCreateThreadを呼び出すと
出所不明のメモリリークに悩まされたりすることになる

逆に言えばMSVCRTを使わないのであればCreateThreadをつかえば良い

707デフォルトの名無しさん2013/07/25(木) NY:AN:NY.AN
テンプレ類は覚えること少なくする目的で簡単にしようという理念からはじまり、
いろいろ隠ぺいすることで逆にめんどくさいものになってるよね

708デフォルトの名無しさん2013/07/25(木) NY:AN:NY.AN
>>703
warning C4441無視してね?

709デフォルトの名無しさん2013/07/26(金) NY:AN:NY.AN
Managed Threadは使わんの?.NETなんだし

710デフォルトの名無しさん2013/08/05(月) NY:AN:NY.AN
array<String^>^ txts = gcnew array<String^>{"りんご", "ごりら", "らっぱ"};
int index = 0;
String^ msg = txts[index ++] + txts[index ++] + txts[index ++];

とやった時にmsg = "りんごりんごりんご"になるのですが
msg = "りんごごりららっぱ"となるようなインクリメントの方法はないでしょうか

711デフォルトの名無しさん2013/08/05(月) NY:AN:NY.AN
3行にわければ?

sehermitage.web.fc2.com/program/c_lang.html
> インクリメント演算子++とデクリメント演算子--は,変数の値を変化させるが,
> その変数が同じ式の中で再び参照された場合,動作は未定義となり値は保証されない

712デフォルトの名無しさん2013/08/05(月) NY:AN:NY.AN
>>711
情報どうもです!式を分けるしかないですね。

713デフォルトの名無しさん2013/08/11(日) NY:AN:NY.AN
32bitのネイティブのDLLを呼び出す.netのDLLがあります。
それを呼び出す.netのアプリの設定で、共通言語ランタイムサポートを/clr:safeでコンパイルすると、64bitOSで動かなくります。
共通言語ランタイムサポートを/clrにすると動きます。/clr:safeのままで動かすにはどうしたら良いでしょう。

714デフォルトの名無しさん2013/08/11(日) NY:AN:NY.AN
>>713
safeだとanycpu指定で作ったアセンブリとなるので、
64bitのWindowsだと64bitモードで動作する
手元にあるVS2010では適当なコンパイルオプションが見つからないので、
CorFlagsで32bitフラグをONにするとかかな

7157132013/08/16(金) NY:AN:NY.AN
>>714
corflagsでいけました。ありがとうございます。

716デフォルトの名無しさん2013/09/08(日) 19:50:17.03
MFCアプリを移行しようと/clrでビルドしたところ、LNK4248が大量に発生しました。
原因は使用しているdllで使う構造体の定義本体がなく事前宣言しかないための
ようですが、これは無視しても問題ないものでしょうか?
当然、この構造体のメンバにアクセスすることはなく、これまでは問題ありませんでした。
また、この警告の出力を抑制する方法はないでしょうか?環境はVS2008です。

717デフォルトの名無しさん2013/09/09(月) 01:05:58.58
数が少ないなら
struct nantoka { };
みたいなのを定義するとか。

あるいは大量にあって全部無視して安全だと分かっているなら link.exe にオプション /ignore:4248 をつけるとか。
(こっちは試したことないので動くかどうかはしらん)

718デフォルトの名無しさん2013/09/10(火) 01:04:26.29
前者の方法でうまくいきました。ありがとうございました。

719デフォルトの名無しさん2013/09/11(水) 18:19:50.17
PropertyGridで説明つけるとき

C#は、
[Description("説明領域に書き込めます。")]

VBは、
<Description("説明領域に書き込めます。")> _
とあるのですが

CLIではどのように記述すればよろしいのでしょうか?

720デフォルトの名無しさん2013/09/11(水) 18:22:25.98
そんなのはMSDN見ろよ
C++/CLIは今はまだサンプル表示できる言語に残ってるぜ

721デフォルトの名無しさん2013/09/11(水) 18:34:21.21
サンプル見てもCLIのPropertyGridのDescription見つからなかったのです。

で、解決しました。
Formと同じusing namespace書いたら
C#と同じ書式でいけました。

722デフォルトの名無しさん2013/09/11(水) 18:35:33.94
ComponentModelにおった

723デフォルトの名無しさん2013/09/23(月) 12:57:32.04
ドッキングウインドウとかできますか?

724デフォルトの名無しさん2013/09/27(金) 21:09:38.57
MDIとか、できない?

725デフォルトの名無しさん2013/09/29(日) 00:32:42.55
bulletを使いたいのですが
整列データ型はサポートされてないって言われ
通りません。
BT_MANAGED_CODE定義以外何か必要なのでしょうか?
教えてください

726デフォルトの名無しさん2013/09/29(日) 16:15:50.71
Imageクラスって各イメージファイル形式のフォーマット知らんでも勝手に保管してくれるんだっけ?
たとえば jpeg の 0xFFD9とか

727デフォルトの名無しさん2013/09/29(日) 16:21:06.24
ちょっと言ってる意味が分からない

728デフォルトの名無しさん2013/09/29(日) 17:39:33.10
あー、ごめん。
例えばBITMAP形式のファイルを読み込んでSaveメソッドでjpeg指定するだけで変換できるのかと。

729デフォルトの名無しさん2013/09/29(日) 17:41:13.27
というか、まぁ出来たは出来たんだけどね。
ただ、.Netのバージョンによって挙動が変わるっぽいね。
0xFFFEの部分が無視されちゃったりされなかったり。

730デフォルトの名無しさん2013/10/02(水) 18:23:28.32
visual studio 2012は、新しい項目の追加で継承されたフォームが
出てこないんですか?
継承されたフォームを作成するにはどうすればいいのか教えてください。

731デフォルトの名無しさん2013/10/12(土) 15:02:58.87
for(int i=0;i<Hoge->Split(array<String^>{L"\r\n"},StringSplitOptions::None)->Length;i++){
...
}

array<String^ >^Hoge_Split = Hoge->Split(array<String^>{L"\r\n"},StringSplitOptions::None);
for(int i=0;i<Hoge_Split->Length;i++){
...
}

int i=0;
for each(String^ Hoge_Line in Hoge->Split(array<String^>{L"\r\n"},StringSplitOptions::None)){
...
i++;
}
のどれが処理が速いの?
「...」の部分が十分に長く要素の番号を参照することがあるとして

732デフォルトの名無しさん2013/10/12(土) 16:26:14.92
試せよ

733デフォルトの名無しさん2013/10/12(土) 16:53:11.84
フォームアプリケーションでの質問だけど、
テキストボックス(名前:textBox1とする)を配置すると、
textBox1->Text
でString型の文字列がとれるんだけど、これをatoiしたいがためにchar型に変換しようとして、
atoi(textBox1->Text->c_str());
って書くと、「c_strはSystem::Stringのメンバではありません」って表示される。
c_strってメンバじゃないの?

734デフォルトの名無しさん2013/10/12(土) 17:06:19.97
じゃないよ
System::Stringとstd::stringは別物

735デフォルトの名無しさん2013/10/12(土) 17:12:51.52
VBじゃねえんだから大文字小文字の区別はつけよう

736デフォルトの名無しさん2013/10/12(土) 17:26:01.80
うおおまじか
紛らわしいな…ありがとう

737デフォルトの名無しさん2013/10/12(土) 23:00:26.48
C++/CLIでWPFをやろうとしていますが、XamlReader::Load()で自作クラスのインスタンス化に失敗します。
フレームワークに含まれるSystem.Windows.Applicationなら<Application>でのインスタンス化に成功するが、
その派生クラスMyApp.Appをインスタンス化しようとして<Application x:Class="MyApp.App" >としても、
クラス名を間違えたときと同じように下のような例外が出てしまいます。。

指定されたクラス名 'MyApp.App' は、実際のルート インスタンス型 'System.Windows.Application' と一致しません。

クラスを見つけられていないんだと思いますが、これはどこかで設定する必要があるんでしょうか?
プロジェクトの設定は「空のCLRプロジェクト」のサブシステムをWINDOWSにして、WPFに必要な
PresentationCore.dllなどの参照を追加した程度です。

738デフォルトの名無しさん2013/10/12(土) 23:10:16.98
Applicationを継承しろ
っていうか素直にC#を併用しろ時間の無駄だ

739デフォルトの名無しさん2013/10/12(土) 23:18:26.35
C#でデザイナ使ったときはXamlってコンパイル時に処理されるからなあ
clr-namespaceとか指定してみたら

740デフォルトの名無しさん2013/10/13(日) 00:20:33.93
<my:App x:Class="MyApp.App" xmlns:my="clr-namespace:MyApp">としてみると

不明な型 '{clr-namespace:MyApp}App' を作成できません。

というエラーになりますね。やっぱり何か認識できていないのかな。

741デフォルトの名無しさん2013/10/13(日) 00:25:09.93
ApplicationのXAMLいらなくね?
普通にコードからgcnew AppしてRunしてMainWIndowすればいいじゃん
アプリケーションリソース使うならリソースディクショナリをLoadXamlすればいいし
デザイナがないのにわざわざデザイナ向けの面倒な方法をとる意味がわからん

742デフォルトの名無しさん2013/10/13(日) 00:51:09.66
App.xamlに限れば省略する手もあるでしょうが、現象としてはMainWindow.xamlも同じなので。
クラスをインスタンス化するという意味においてはApp.xamlもMainWindow.xamlも違いは
ありませんので、例としてApp.xamlを挙げたに過ぎません。

743デフォルトの名無しさん2013/10/13(日) 08:31:38.34
>>733
やりたいなら、Convert::ToInt32(textBo1x->Text)
だな

744デフォルトの名無しさん2013/10/13(日) 08:32:40.33
ちとタイプミスったが許せ

745デフォルトの名無しさん2013/11/10(日) 04:03:56.73
C#のfixedとC++/CLIのpin_ptrって同じものですか?

C#で配列をfixedして処理するより,C++/CLIにマネージ配列で渡した後,C++/CLI内でpin_ptrして処理する方が速いのでしょうか?

初歩的な質問で申し訳ないです.

746デフォルトの名無しさん2013/11/10(日) 07:13:51.28
ネイティブコードに渡さないときはinterior_ptrで書くんじゃない。
パフォーマンスは大差ないかと…。

747デフォルトの名無しさん2013/11/10(日) 07:53:22.46
そもそも普通にマネージコードで処理するんならC#で普通にインデックス使って回せば最適化されるから十分速い
ヘタにポインタ使った方が遅くなることもある

748デフォルトの名無しさん2013/11/10(日) 12:45:13.44
パフォーマンス的には対して変わらない,下手な書き方をすればかえって遅くなるということでしょうか?

やりたかったのは,C#からBitmapとint配列を渡して,C++/CLI内でヒストグラムを作るとかそんなところです.
C#側からは,
MakeBrightnessHistogram(Bitmap^ bmp, array<int>^ histogram)
を呼び出して,この関数の内部でFormat32bppRgbのBitmapDataを取得し,histogramをpin_ptrで固定した後,
MakeBrightnessHistogram_Unmanaged(int* data, int size, int* p_histogram)
を呼び出すというような形になっています.(dataはBitmapData->Scan0をint*にキャストしたもの,sizeはbmpの画素数)
ちなみに,MakeBrightnessHistogram_Unmanaged内で,RGBの値をBrightnessに変換する変換テーブル(ネイティブ配列)にアクセスしています.

画像データやヒストグラム,変換テーブルといった配列にアクセスする命令が多いので,C++/CLIを使えば速くなるのかと思ってプログラムしてみたのですが,
こういった処理は,わざわざC++/CLIを使わなくても,C#で高速にできるものなのでしょうか?
最初から素直にこれを質問すれば良かったですね...

749デフォルトの名無しさん2013/11/10(日) 13:40:47.67
そういうコード書くならCかC++でDLL作って
それを呼び出すようにした方が手っ取り早い気がするのよ

750デフォルトの名無しさん2013/11/10(日) 13:53:11.58
C#で書いて問題になるほど遅かったら移植すればいいでしょ
実際そんなに変わらないけどな
パフォーマンスの心配は9割無駄だからくだらないこと気にしてないでまずは動かせ
先入観でパフォーマンスを考えるほど無意味なことはない

751デフォルトの名無しさん2013/11/10(日) 14:12:32.92
とりあえずC#で書いてみて,処理速度がDLLを呼び出す方法と対して変わらないようであれば,
DLL使わずにC#だけで書くようにしたいと思います.

ありがとうございました.

752デフォルトの名無しさん2013/11/10(日) 19:45:52.63
>>748
lockbits()を使うだけでも相当速くなるぞ
BitMapキャンバスへの描画メソッドは物凄く遅い

http://homepage2.nifty.com/nonnon/SoftSample/CS.NET/SampleBitmapPlus.html
http://tinqwill.blog59.fc2.com/blog-entry-46.html

ここら辺とか

753デフォルトの名無しさん2013/11/10(日) 23:31:16.11
BitmapDataと言ってるからLockBitsは使ってるんでしょ

754デフォルトの名無しさん2013/11/11(月) 09:48:07.24
>748
アルゴリズムをunmanagedで書くなら、たしかにSSE2 intrinsicとか使えば圧倒的なスピードが出る。
でも、それならP/Invokeでいいのでは感がある。

755デフォルトの名無しさん2013/11/11(月) 22:42:22.66
環境に合わせて最適なコード吐くんだろ?違うのか?

756デフォルトの名無しさん2013/11/18(月) 13:42:22.83
byte[,] bmp = new byte[640,480];

とかやってたりしてw

757デフォルトの名無しさん2013/11/19(火) 13:06:00.35
>>756
それ自体別に何もおかしくないぞ
必要ならポインタでアクセスすることもできる

758デフォルトの名無しさん2013/11/21(木) 11:24:38.95
>>757
C#が遅いとか言ってる奴いるけど、C#で多次元配列をこう書くと遅くなるんよ
ジャグ配列を使うか一次元配列で処理すれば、C++とほぼ同じ速度で処理出来るが

759デフォルトの名無しさん2013/11/21(木) 22:16:01.02
だからポインタでアクセスできると言ってるでしょ
ポインタ使えば多次元配列でも1次元配列をforループで回して最適化が効いた時と同程度には速くなるよ

760デフォルトの名無しさん2013/11/21(木) 23:39:11.69
あれ?遅いのはジャグ配列じゃなかったか?
最近別言語の案件やってるんで忘れてしまったわ

761デフォルトの名無しさん2013/11/21(木) 23:47:38.45
bmp[y][x]をx方向に処理する場合は1次元配列の連続アクセスと同じなので速い
y方向だと無茶苦茶効率悪いから多次元配列のほうが有利

762デフォルトの名無しさん2013/11/22(金) 09:39:48.63
bmp[x + y * bmp.width]
で、ええやん

763デフォルトの名無しさん2013/12/03(火) 03:37:15.12
スマホで眺めるのによいライブラリリファレンスサイト教えてください

764デフォルトの名無しさん2013/12/14(土) 00:11:16.35
速度が問題になるとこをCLIで書くなよ。

765デフォルトの名無しさん2013/12/16(月) 23:15:56.37
ある外部staticライブラリをつかうプロジェクトをVS2008で作ったんですが
それをデバッグリンクすると実行時にランタイムでヒープが壊れてるとか
アサートだします。
出すところは外部ライブラリで
static std::map<>;
してグローバルにmapを作ってるところです。

clrなしのプロジェクトを作ってやってみると問題ないんですがなにが悪いんでしょう?
ランタイムライブラリはどちらも/MDdで外部ライブラリと同じです。

766デフォルトの名無しさん2013/12/16(月) 23:55:38.87
STLCLIを使えというヘジたんの思し召し

7677652013/12/17(火) 01:47:56.48
http://stackoverflow.com/questions/4928763/mixed-mode-c-cli-crashing-heap-corruption-in-atexit-static-destructor-regist
/ENTRY:mainが悪いみたいだよ
消してWinMainからmainよんだら直った

768デフォルトの名無しさん2013/12/17(火) 17:35:03.34
OnPaintBackgroundさせないようにするため
Panel継承したMyPanelを作り、
今までgcnew Panelされてた部分をMyPanelに置き換えたら、
デザイン編集する画面がエラーになりました。

継承したコントロールをデザインで使う方法か
Panelコントロールの再描画を継承しないですむ方法ありますか?

769デフォルトの名無しさん2014/01/29(水) 15:03:47.19
C++/CLIってUNICODE使うのがデフォ?

770デフォルトの名無しさん2014/01/29(水) 15:11:01.76
System::String^はそうだな
ネイティブ側は好きなのにしる

771デフォルトの名無しさん2014/02/16(日) 08:13:15.62
VC6以来のWinアプリの仕事何だけど
最近は.net使えばグラフ表示とか簡単にできるようになったの?
それともGDI使うやり方健在?

772デフォルトの名無しさん2014/02/16(日) 09:39:35.75
市販のかexcel使ったほうが早いという状況は変わらん

773デフォルトの名無しさん2014/02/16(日) 23:57:23.21
EXCELに描かせるのが一番金がかからない

774デフォルトの名無しさん2014/02/17(月) 13:02:54.72
エクセル最強すぎる。
C++でエクセル出力したい。
CSV無しで

775デフォルトの名無しさん2014/02/17(月) 13:47:00.62
POIかNPOIで

7767712014/02/17(月) 18:45:06.84
オシロの画面みたいなのを1秒あたり10フレームくらい表示させたいのですが,,,

777デフォルトの名無しさん2014/02/18(火) 10:09:25.99
今どうやってんの?
DirectX使ってる?

778デフォルトの名無しさん2014/02/18(火) 13:15:15.29
WPFなら秒間60フレーム余裕だよ

779デフォルトの名無しさん2014/02/19(水) 15:44:04.10
C#でも余裕だな
3日もあればそれなりの物作れるし

780デフォルトの名無しさん2014/02/20(木) 17:38:23.07
今のPCなら10fpsは全くもって問題無い
俺は初めて自力描画したが、25ms間隔でUSB送信+描画が全く問題無かった

781デフォルトの名無しさん2014/02/22(土) 18:10:01.30
C++プロジェクトとC#プロジェクトからなるソリューションを
作る場合は、DllImport を使うのが正統的なやり方ですか?

782デフォルトの名無しさん2014/02/22(土) 18:18:26.53
C++/CLIを使うのも別に不当ではないぞ
好きにしろ

783デフォルトの名無しさん2014/02/22(土) 18:19:01.60
エスパー呼んでる?

784デフォルトの名無しさん2014/02/22(土) 18:21:31.68
でもさ、C++/CLIって今はWindowsフォームアプリ作れなくなったというか、非推奨でしょ?
ヒッジョーに残念なんだけど、俺はクソなC++Builder使ってる

7857812014/02/22(土) 19:14:11.22
>>782,783,784
最近C++始めました。今まで作ったC#の自作ライブラリをC++化しようとしています。
CLRクラスプロジェクトでクラスライブラリを作ってC#アプリから使う場合は、普通に
参照設定して使えましたが、でもそれだと、クラスライブラリの中身がReflectorなどで
見えてしまうので、それで/clr無しでビルドしてDllImportの方法でC#から使えたのですが、
これが正しいやり方かどうか知りたかったのです。要するに、逆コンパイルできない
(あるいは難しい)クラスライブラリを作りたいのですが。

786デフォルトの名無しさん2014/02/22(土) 19:25:29.69
難読化しろ

7877812014/02/22(土) 20:01:19.06
>>786
それも考えたのですが、C#のDLLを難読化するくらいなら、C++でDLL
作るほうが手間がかからないかなと思ったのですが。
皆さん、こういう用途には、VS2013付属の難読化ソフトで十分ですか?

788デフォルトの名無しさん2014/02/22(土) 21:16:20.23
秘密にしたいところはC++で書くよ

789デフォルトの名無しさん2014/02/24(月) 10:59:05.87
ILMergeはC++/CLIでも使えますか?試したら出来ませんでした。

790デフォルトの名無しさん2014/02/24(月) 12:00:23.44
mixed moeだとだめかもしれんね。/clr:safeや/clr:pureは試した?

791デフォルトの名無しさん2014/02/24(月) 12:18:42.22
> clr:safeや/clr:pure
これ使うならC++/CLI使う理由が消えないか?
難読化がC++/CLI使う目的ならなんか違う気がする
業務か趣味かでも違うし

792デフォルトの名無しさん2014/02/24(月) 13:20:04.45
難読化の質問の続きなのか?

793デフォルトの名無しさん2014/02/26(水) 11:45:55.31
VS2013に難読化のソフト付属するようになったのか

794デフォルトの名無しさん2014/02/26(水) 14:39:40.34
わざわざネイティブコードがちょろっとついてたら、まっさきにそこ覗くけどね
まあしっかり考えて。

795デフォルトの名無しさん2014/02/26(水) 15:10:45.06
確かに、覗いてみたくなるな
Dependency Walkerに放り込むだけでもそれなりに見えてくるしな

796デフォルトの名無しさん2014/02/26(水) 22:42:23.74
確かにすげー怪しいもんなw
むしろ、木を隠すなら森の中じゃないかな。

797デフォルトの名無しさん2014/02/27(木) 00:13:46.26
ILが解析しやすいのはディスコンパイルできることよりも、
型名やメソッド名などのメタ情報がそのまま残ってることだから、
その辺改善したほうがましだな。
簡単な難読化ツールのやってることもその程度だし

798デフォルトの名無しさん2014/03/08(土) 21:13:21.28
>>784
俺は顧客の強い要望でVS2013 expressのVC++でWindows formアプリを作ってる。
非推奨だけど、作ろうと思えば一応作れるのね。

799デフォルトの名無しさん2014/03/10(月) 10:17:51.76
C++でのデザイナ機能も一応残してるんだよね
っていうか、Expressでも出来るんだ

800デフォルトの名無しさん2014/03/10(月) 20:21:18.79
>>799
できますよ

801デフォルトの名無しさん2014/03/11(火) 10:47:47.08
ATL/MFCもexpressでやらせてくれたらいいのに
あったらあったでそれなりに便利

802デフォルトの名無しさん2014/03/11(火) 10:59:46.32
ATL/MFC無しでもCStringくらい標準にしてくれるといいのにね
System::Stringからの変換がスマートにできるのに

803デフォルトの名無しさん2014/03/11(火) 11:35:40.31
ATL/MFCまで入れちゃったら有償版と変わらないのでは?

804デフォルトの名無しさん2014/03/11(火) 15:16:32.72
まあそれ以外にも違いはいろいろあるし

805デフォルトの名無しさん2014/03/11(火) 23:00:52.68
ウィザードやリソースエディタなんかがないとまともに開発には使えないだろうけど、
MFCのコードをビルドだけできるようヘッダとライブラリを公開して欲しいとは思う。

806デフォルトの名無しさん2014/03/15(土) 21:18:07.18ID:KpGSNq9a
C++/CLIとC#を相互運用するとき、IDisposableの扱いについて参考になるWebページがあれば教えてください。

807デフォルトの名無しさん2014/03/20(木) 14:59:59.03ID:svYczKSB
初歩的な質問ですみません。

^ がついた関数と ^ がついていない関数の間でやりとりをしたいのですが、
やりかたが分かりません

例えば時間を再設定するときに、
DateTime^ dth = gcnew DateTime(2014, 3, 20, 0, 0) と
DateTime dt = DateTime(2014, 3, 20, 0, 10) を作ったとして、

dth = dth->AddSeconds(10) とかではなく、

dth = dt.(なにかの変換演算子) で時間を再設定してみたいのですが、
なにか方法はありませんか?

808デフォルトの名無しさん2014/03/20(木) 15:11:41.08ID:IvzGN7OH
dth = dt;
dth = %dt; // 丁寧に書いた場合

809デフォルトの名無しさん2014/03/20(木) 17:32:35.09ID:yZVXWZKu
C++/CLIでは値型とクラスの場合で書き方が変わったりするから要注意だな

810デフォルトの名無しさん2014/03/20(木) 17:57:34.38ID:iFIpmoD3
C++/CLIで作っているフォームの表示が気づいたらXP仕様になってしまいました
過去につくった物はWin8仕様の表示になっているのですがどこの設定で変更できるのでしょうか
環境はWindows8.1でVS2012です

811デフォルトの名無しさん2014/03/20(木) 20:04:05.05ID:svYczKSB
>> 808-809
ありがとうございます。さっそく参考にしていろいろ調べてみますv

812デフォルトの名無しさん2014/03/20(木) 20:28:07.59ID:svYczKSB
807です。質問の時に代入する方向が逆でしたが、もらったヒントで
無事解決できました m(_ _)m

dth = %dt; // DateTime^ = DateTime
dt = static_cast<DateTime>(dth); // DateTime = DateTime^

813デフォルトの名無しさん2014/03/20(木) 21:58:05.31ID:geioZCY7
2段目のはこれでいけるな。
dt = *dth

 -> が *. なのもCの文法と同じ。
dth->AddSencond(...)
(*dth).AddSencond(...)

814デフォルトの名無しさん2014/03/20(木) 22:26:22.96ID:svYczKSB
>>813
一文字で決まるおまじない教えてくれてありがとうですv

815デフォルトの名無しさん2014/03/23(日) 21:20:34.11ID:HlHPSHO4
質問失礼します
クラスaの配列をメンバ変数に持つクラスbを作りたいのですが、クラスaの配列の初期化がうまく行きません。(コンパイル自体はできます)
これは初期化の方法が間違っているのでしょうか?
それともそのような設計(クラス配列を持つクラス)自体がよろしく無いものなんでしょうか?

ref class a
{
  int x;
public: a(int num){x = num;}
};

ref class b
{
  array<a^>^ array_a;
public:
  b(){
    array_a = gcnew array<a^>(10);
    for (int i = 0; i < array_a->Length; i++)
    {
      array_a[i] = gcnew a(i);
    }
  }
};

816デフォルトの名無しさん2014/03/23(日) 21:31:58.22ID:lzq9JOXE
問題なさそうだけど どう「うまく行きません」なの?

817デフォルトの名無しさん2014/03/23(日) 22:35:57.72ID:HlHPSHO4
実体がない(?)と言いますか、array_aに何かしようとすると、その関数のそれ以降の処理をすっ飛ばすようになります。

例えばクラスaにint GetX(){return x;}、
クラスbにint GetArrayA(int num){return array[num]->GetX();}みたいな関数を追加して、
ウィンドウズFormの方でLabelを一つ用意します。

private: System::Void MyForm_Load(System::Object^ sender, System::EventArgs^ e) {
  b^ test;
  test->GetArrayA(0);
  Label1->Text = "だいじょうぶ";
}

これだと、Label1->Textは「だいじょうぶ」に変わらずLabel1のままです。
しかし
>test->GetArrayA(0);
の部分をコメントアウトにするとLabel1->Textは「だいじょうぶ」になります。

818デフォルトの名無しさん2014/03/23(日) 23:19:57.49ID:ZHSALumd
これってコンパイル通る?>>817の方。

819デフォルトの名無しさん2014/03/23(日) 23:36:35.34ID:HlHPSHO4
>>818
817もコンパイルは通ります
あと、今試してみたんですが出来上がったexeファイルを起動してみると
「アプリケーションのコンポーネントで、ハンドルされていない例外が発生しました。(中略)
オブジェクト参照がオブジェクトインスタンスに設定されていません」
と出ますね……
こちらもまたtest->GetArrayA(0);の部分をコメントアウトすると問題なく起動します

820デフォルトの名無しさん2014/03/24(月) 01:02:03.43ID:XCyA/SAw
test =gcnew 以下略つけてみたら?

821デフォルトの名無しさん2014/03/24(月) 01:50:12.79ID:Ae/Hf3r6
>>820
あっ……「だいじょうぶ」になりました。
ありがとうございました!

822デフォルトの名無しさん2014/03/24(月) 11:45:41.86ID:R2MpMn2O
デバッガ使えない環境なのかな、、、
例外起きた時は出力ウィンドウに出るぜ

823デフォルトの名無しさん2014/04/26(土) 12:11:13.54ID:J0aLOZMr
c#のdynamic型に相当するものを
c++/cliで何と書けば良いですか?

824デフォルトの名無しさん2014/04/27(日) 21:57:27.97ID:t/xZR1S/
多分無い

825デフォルトの名無しさん2014/05/09(金) 18:40:24.14ID:avbF2wuD
c++/cli勉強したいと思っています。
>>array<a^>^ array_a;
の<a^>^ってどいういう意味ですか?
顔文字に見えます。ググりたいのですが^>^でググっても
ヒットしません。キーワードを教えてけろ。

826デフォルトの名無しさん2014/05/09(金) 18:46:04.26ID:Mn4+ksrv
トラッキングハンドル

827デフォルトの名無しさん2014/05/09(金) 19:05:13.77ID:avbF2wuD
>>826
ありがとうございます。さっそくググってみます。

828デフォルトの名無しさん2014/05/11(日) 22:02:14.61ID:OFkZfhFe
参照型を内部に保持するコンテナの参照を宣言かな。

829デフォルトの名無しさん2014/05/13(火) 09:25:37.06ID:QKhoqLLT
ジェネリックメソッドの継承がうまく行きません。

generic<typename T> ref struct B;

ref struct A abstract {
generic<typename U> virtual A ^f(B<U> ^u) = 0;
};

//C4570 明示的に抽象として宣言せずに抽象関数を含んでいます
generic<typename T> ref struct B : A {
//C4490 オーバーライド指定子が不適切
generic<typename U> virtual A ^f(B<U> ^u) override {
return u;
}
};

同じ戻り値と引数でも、同じ関数だと認識されないようなのですが、どのようにすれば良いですか?

830デフォルトの名無しさん2014/05/13(火) 10:02:57.61ID:Kixx6i0Q
ttp://social.msdn.microsoft.com/forums/vstudio/ja-JP/2f138907-64a3-4326-bfea-d0e4b3c15fa8
仕様っぽいのであきらめてC++/CLI投げ捨ててC#で書く

831デフォルトの名無しさん2014/05/13(火) 10:44:57.11ID:QKhoqLLT
なるほど・・・ありがとうございました。

832デフォルトの名無しさん2014/05/13(火) 23:30:42.34ID:OiuzuWyN
C#でdelegateに設定されたメソッドを調べるのにGetInvocationListを参照していたのですが、
C++/CLIで同じようなことをするとコンパイルエラーが発生してしまいます。
どのようにコーディングすればよいでしょうか?

// C#
http://ideone.com/O4j7TX

// C++/CLI
http://ideone.com/Lazyxs
※実際は23行目のauto mcd = (MulticastDelegate^)hoge->Piyo;で
error C3918: 使用するには、'Delegate::Hoge::Piyo' がデータ メンバーでなければなりません
といったエラーが発生してしまいます。

833デフォルトの名無しさん2014/05/13(火) 23:41:08.55ID:RH21G1qI
C++/CLIの方はeventじゃん

834デフォルトの名無しさん2014/05/13(火) 23:47:44.50ID:OiuzuWyN
>>833
あーeventキーワード取っ払ったら通りました。ありがとうございます。
そこでコンパイルエラーにしてくれたらいいのに…。

835デフォルトの名無しさん2014/05/14(水) 08:39:30.20ID:ICklhj5Y
event自体は正当で使う側が問題なのに、eventの方でコンパイルエラー言われても

836デフォルトの名無しさん2014/05/14(水) 11:14:20.64ID:k1JIQlQE
ワロタ

837デフォルトの名無しさん2014/05/14(水) 23:09:07.27ID:OfRhuTl1
すいません>>832です。
禿しく勘違いしてました。C#のeventはシンタックスシュガーなんですね。
event EventHandler^ Piyo
{
void add(EventHandler^ value) { mPiyo += value; }
void remove(EventHandler^ value) { mPiyo -= value; }
void raise(Object^ sender, EventArgs^ e) { mPiyo(sender, e); }
}
EventHandler^ mPiyo;
などとしたら上手くいきました。

838デフォルトの名無しさん2014/05/26(月) 03:20:04.74ID:l0k3Jdk0
c++/cli初めて作成しています。

c++プロジェクトでライブラリを作成して
void func1(const char *p){
cout << p << endl;
}
を定義して、
c++/cliプロジェクトでこの関数を呼び出すと、

func1("Hello World"); //呼び出し成功
func1("Hello" + "World"); //型 "System::String ^" の引数は型 "const char *" のパラメーターと互換性がありません

となったので、エラー解決のために少しググって、よくわからないまま
char* pStr = (char*)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi("Hello" + "World").ToPointer();
のようにして、
func1(pStr); //呼び出し成功
しました。

この場合、
func1("Hello" + "World");
を実行可能に出来るようにc++ライブラリ側で、この引数を受けられるfunc1関数を定義することは可能でしょうか?

839デフォルトの名無しさん2014/05/26(月) 05:33:40.37ID:TbdBw+Sj
無理

840デフォルトの名無しさん2014/05/26(月) 09:14:28.60ID:l0k3Jdk0
>>839
そうですか無理ですか。
出来れば、出来ない理由を教えてください。

841デフォルトの名無しさん2014/05/26(月) 09:35:16.69ID:QBzBPwJ7
System::String^はネイティブでは直接扱えないから

842デフォルトの名無しさん2014/05/26(月) 09:42:14.96ID:l0k3Jdk0
>>841
なるほど。ありがとうございました。

843デフォルトの名無しさん2014/06/16(月) 00:28:31.77ID:KzXlrctf
c#で書かれたdllを呼び出すc++/cliのラッパー
static libを作り、それを呼び出すc++のコードを
書けば、c++でc#のdllを呼び出す事が出来ますか?

844デフォルトの名無しさん2014/06/16(月) 03:18:12.95ID:TImdW3D8
出来るよ。リンク時に/MDオプションを使う必要はあったと思うけど。

845デフォルトの名無しさん2014/06/16(月) 11:06:40.38ID:KzXlrctf
>>844
コメントありがとうございます。
c#からc++を呼び出す例はググるとたくさんあるの
ですが、c++からc#を呼び出す良い例、どこかに
ないでしょうか?

846デフォルトの名無しさん2014/06/20(金) 23:37:50.80ID:oekTSRl4
std::regexで"["や"]"などの文字を扱うにはどう書けばいいですか?
たとえばテキスト中に"[43]"などの[]で囲まれた数字があるかどうか知りたいのですが。

8477652014/06/21(土) 16:55:19.23ID:BNLCZco1
久しぶりにVS開いたらWinFormが消えとる。もう捨てられるのか

>>845
これか
http://code.msdn.microsoft.com/windowsdesktop/CppHostCLR-e6581ee0

>>846
\でエスケープします
regex r("\[43\]");

848デフォルトの名無しさん2014/06/21(土) 16:56:33.36ID:BNLCZco1
regex r("\\[43\\]");
こうか

849デフォルトの名無しさん2014/06/25(水) 18:40:03.79ID:a/L3Ky6p
こんどCLI+API+STLで久々に開発するぜ
まともにWindowsアプリ作るの15年ぶりだぜ

850デフォルトの名無しさん2014/06/25(水) 18:40:43.32ID:jtRedncf
ご愁傷様

851デフォルトの名無しさん2014/06/25(水) 19:43:48.20ID:a/L3Ky6p
なんでご愁傷様?

852デフォルトの名無しさん2014/06/29(日) 15:12:56.12ID:74KQZ/Pg
WebBrowser::ActiveXInstanceのようなCOMポインターをObject^で返したいんですが
どう書いたらいいんでしょうか

Object^ get()
{
IUnknown* pU; //これを返したい
...
}

C#だと全部属性でやってて生ポインタをどう処理するかの参考にならないです。

853デフォルトの名無しさん2014/06/30(月) 07:13:06.08ID:AE59suyp
それを返した先でどうするのさ
例えばIntPtrを返しても一応Object^にはなるけど多分そういう事じゃないよね?

854デフォルトの名無しさん2014/06/30(月) 08:29:40.70ID:k6aB52Mb
Object^o=Marshal::GetTypedObjectForIUnknown(IntPtr(pU),Object::typeid);
とりあえずこうしました
addref,releaseが同じにならないといやだけど

855デフォルトの名無しさん2014/07/30(水) 21:04:47.45ID:4VkY0HvI
C++/CLI超楽しい
.Net、WinAPI、STL、Boost混在できて使いたい放題だし
何でみんな毛嫌いするの?

856デフォルトの名無しさん2014/07/30(水) 22:46:45.65ID:310IZqCv
C++とは似て異なるから

857デフォルトの名無しさん2014/07/30(水) 23:48:31.72ID:QJA3s1XV
最初から別言語だと思っとけばいいじゃん。
俺もC++/CLIは面白いと思うが、先がなさそうなのが残念だな。
WPFが使えるようになったらMFCのアプリを移行したいと思っていたんだが。

858デフォルトの名無しさん2014/07/31(木) 13:36:46.98ID:N7h43RT+
やりたい放題というのは1人でやってるだけなら楽しいが
足を引っ張る仲間がいると地獄巡り満腹コースになる

859デフォルトの名無しさん2014/07/31(木) 20:54:03.92ID:Ng6XWAlf
マネージ関数の中でlambda使えないとか、最近は混ざる利点みたいなものが少なく…。

860デフォルトの名無しさん2014/08/05(火) 16:06:10.29ID:8/O3Z/TB
genericとtemplate混ぜたら楽しいと思ってたけど、
あんまり混ざらないようにできてる・・

861デフォルトの名無しさん2014/08/05(火) 21:42:31.92ID:a3vuC94X
variadic template使って型パラメータの数が違うgeneric classを使えるかと思ったら、なんかエラーになるしね。

862デフォルトの名無しさん2014/08/06(水) 12:55:33.48ID:YJYkBYpf
genericクラスの中にtemplateは作れないし
その逆もできない。
できるのは、genericクラスをtemplateで
継承するくらい。

>>861 variadic genericあったらいいなぁ

863デフォルトの名無しさん2014/09/26(金) 00:00:55.65ID:Q/qK3xNe
C++/CLIに直接関わる質問ではないのですが
適切なスレが見当たらなかったのでここで質問させてください。

ネイティブのnative.dllをマネージのmanage.dllが参照しているとき
native.dllにパスが通っていない状態でmanage.dllを使用すると
FileNotFoundExceptionが発生してしまいますが、
その例外の値からはnative.dllが見つからないことが原因であることを
判断することができません。

そこでmanage.dllが参照しているdllの一覧のようなものを取得したいのですが
そのようなAPIは用意されていますでしょうか?
とりあえずdumpbin.exe /dependentsで出力される結果を用いる実装にしてみたのですが
やはり外部の実行ファイルに頼るのは微妙ですし、何より処理が重いです。
Win32APIでも構いませんので何か方法がありましたらご教示ください。

864デフォルトの名無しさん2014/09/26(金) 08:53:54.22ID:CyXmGE6J
開発フェーズなら
Dependency Walkerというツールがある

865デフォルトの名無しさん2014/09/26(金) 08:56:02.56ID:CyXmGE6J
あっ、実行時の話やったか

866デフォルトの名無しさん2014/09/26(金) 11:29:52.72ID:b/KTTsk9
FileNotFoundが発生したら
LoadLibrary("native.dll");
GetLastError()してみるってのはどうだろう?

867デフォルトの名無しさん2014/10/08(水) 22:50:24.63ID:T8t7hCtu
>>863です。亀ですいませんが解決しました。
APIとしてはImageHelpライブラリ辺りが使えそうだったのですが途中で詰まったので断念。
結局ファイルを直接読んでIMAGE_DOS_HEADER構造体からたどって
インポートデータを解析することで対応できました。

868デフォルトの名無しさん2014/10/16(木) 17:29:15.53ID:sLOsTk32
質問です。

MyCapsuleというクラスを作り、GetValue(参照渡しの引数)という仮想関数を
定義しておいて、このクラスから派生したクラスにおいてGetValueの実装を
するにあたり、与えられた引数がある特定の型に合致する場合にはその
引数に値を代入する、という動作を実現したいです。
例えばMyCapsuleIntという派生クラスでは、与えられた引数がint型だった
場合に、その引数に(何かしらメンバ変数などの)値を代入する、というもの
です。

こういう場合アンマネージドだと引数としてvoid*を使った実装になるかと
思うんですが、マネージドだとかわりにObject^%とかを使うのでしょうか?
ハンドルと追跡参照について未だによくわかっていないので、どうするのが
一般的な作法なのか見当がつきません。

よろしくお願いします。

869デフォルトの名無しさん2014/10/16(木) 21:50:11.68ID:rtOJWyFH
アンマネージからマネージの関数を呼んで
マネージドの中で作ったString^からchar*でアンマネージドに戻したいんです。

調べたところ
(char*)Marshal::StringToHGlobalAnsi("").ToPointer()ってのがあるのはわかったのです。
けど、これで戻してもアンマネージドからMarshal::FreeHGlobalが呼べないのでだめです。
一度StringToHGlobalAnsiで得たchar*を別のcharのバッファにコピーしてから戻す方法になるのでしょうか。

870デフォルトの名無しさん2014/10/16(木) 22:01:55.82ID:rvFRd6iT
Marshal::StringToHGlobal...で確保したのはLocalFreeすればいいけど
普通は呼び出し元がバッファ用意するなり、std::stringとかで返すなりするもんじゃね?

871デフォルトの名無しさん2014/10/16(木) 22:15:47.60ID:rtOJWyFH
なるほどLocalFreeで解放できるんですね。

>普通は呼び出し元がバッファ用意するなり
固定長になるからどうしようかなとおもって。

>std::string
StringToHGlobalAnsiで領域を確保したのに
stringでまた確保されるのがあれかなとか。
気にしすぎといわれればそうです・・・。

872デフォルトの名無しさん2014/10/22(水) 13:38:11.49ID:5iN2ViqP
C#みたいにCodeProviderで動的な文字列をコンパイルして
実行したいんですが、もしかしたらC++/CLIにはCodeProviderが
ないですか?

873デフォルトの名無しさん2014/10/22(水) 13:43:12.37ID:5iN2ViqP
すいません、抜けてました。
CodeDomProviderを継承したCodeProviderです

874デフォルトの名無しさん2014/10/22(水) 17:09:24.88ID:LQAHBIBx
まあ混合型使えないからそれならC#でいいじゃんってことになるよね

875デフォルトの名無しさん2014/11/11(火) 14:49:35.49ID:TsA8Knwq
C++のDLLをC#で使いたいのですがC++/CLIで吸収したほうがいいのかな?
C++の構造体のポインタとかあってわけわからん

876デフォルトの名無しさん2014/11/11(火) 16:50:02.76ID:9mz6Ds+P
構造体 マーシャリング でぐぐる

877デフォルトの名無しさん2014/11/12(水) 00:51:06.13ID:pdAxKpZn
>>875の件ですがC#でなんとかがんばることにしました
お騒がせしました

878デフォルトの名無しさん2014/12/09(火) 00:10:16.60ID:xpR1dfQS
C++/cli からC++のプロジェクトに定義している関数を呼び出したいんです。
C++プロジェクトのlibファイルを参照し、includeファイルをC++/cli側に
持ってきて#include すると、物凄い数のエラーがでます。

(C2011:C2079:C2504:C3395:C3699)

[1] C++/cliで参照できるよう、ビルドエラーを直すしかない

[2] 別の方法でC++の関数をビルドエラー無しに参照できる。

ちなみに、C++の関数を参照しないで自作・・・という回答は無しでお願いします。

879デフォルトの名無しさん2014/12/09(火) 10:30:47.48ID:sSNN3cut
物凄い数のエラーじゃなくてエラーの内容をチェックしろよ。
出力ログのエラーの行をダブルクリックすると問題の箇所に飛ぶから
何で再定義だとか定義がないと言われてるか考えろ。
何でその程度のレベルでC++/CLIとかやってんの。

880デフォルトの名無しさん2014/12/09(火) 10:30:56.11ID:Xzj5HeMN
1.C++から呼び出す
2.C#に移植する

C++/CLIでなきゃいけない理由なんてあるん?

8818782014/12/09(火) 22:59:58.60ID:ygQnozb4
すみません、初心者なりにエラーの原因を調べてきました。

a.h

class A : public B {}

b.h

class B {}



この時に Class B で再定義のエラーが発生していました。

a.h が先にincludeされているのが問題で、b.h を先にinclude するよう
ソース修正すれば良い・・・・・ということでしょうか??

882デフォルトの名無しさん2014/12/11(木) 12:05:51.55ID:WAwY/dPu
各ヘッダの先頭に#pragma onceと書く

a.hでb.hのクラスを使っているなら
a.h内でb.hをinludeしろ

cpp側でincludeの順を気にしなきゃならないのは糞

883デフォルトの名無しさん2014/12/15(月) 20:00:30.77ID:JoQajMNA
質問です。

任意の型のマネージド配列(cli::array)を、任意の個数、引数として受け取って
それらの配列としての長さの最小値を返す関数を書きたいと思っています。

イメージとしては、
array<String^> arrStr = gcnew array<String^>(6);
array<double> arrDob = gcnew array<double>(8);
array<int> arrInt = gcnew array<int>(3);
に対して、
Function(arrStr, arrDob) = 6
Function(arrStr, arrDob, arrInt) = 3
となるような関数Functionを書きたいと思っています。

しかし、この場合の引数リストの書き方がよくわかりません。
単純に可変長の引数リストだとFunction(... array<Object^>^ args)みたいな
書き方になると思うんですが、これをマネージド配列の配列だからといって
真似てFunction(... array<array<Object^>^>^ arrays)みたいな書き方をしても、
呼び出し側(例えばFunction(arrStr, arrDob)とか)で引数リストが一致しない旨
怒られます。このような場合の適切な引数リストの書き方ってありますか?

あるいは回避策として、引数はFunction(... array<Object^>^ args)としておき
この関数の中でfor each (Object^ arg in args) { argが配列かどうか }という
コードもありえますが、肝心の、「argが配列かどうか」チェックするコードが
わかりません。

上記いずれか一方で構いませんので、解決策をご教授いただけないでしょうか?

884デフォルトの名無しさん2014/12/15(月) 20:51:05.44ID:oSpn/+/y
... System::Array^ args
arg->GetLength

... System::Collections::IList^ args
arg->Count

885デフォルトの名無しさん2014/12/15(月) 22:28:59.04ID:JoQajMNA
>>884
試してみましたが、いずれの場合もコンパイルエラーC3132が発生します。

そもそもargの型を何に指定すべきなのか、というのがよくわかっていません。
例えば
int Function(... array<Object^>^ args)
{
  int MinLength = -1;
  for each(array<Object^>^ arg in args)
  {
    if ( (MinLength < 0) || (arg->Length < MinLength) )
    {
      MinLength = arg->Length;
    }
  }
  return MinLength;
}
みたいなコードだと、Function(arrStr, arrInt)を実行したとき、それら引数を
System.Object[]にキャストできない旨を怒られます。

886デフォルトの名無しさん2014/12/15(月) 22:43:22.71ID:oSpn/+/y
ごめんちょっとぼけてた
... array<System::Array^>^ args
for each (auto arg in args) { int len = arg->GetLength(0);
... array<System::Collections::IList^>^ args
for each (auto arg in args) { int len = arg->Count;

887デフォルトの名無しさん2014/12/15(月) 22:49:54.98ID:JoQajMNA
>>886
うまくいきました!
動作版のコードは以下の通りです。

int Function(... array<System::Array^>^ args)
{
  int MinLength = -1;
  for each(auto arg in args)
  {
    if ( (MinLength < 0) || (arg->Length < MinLength) )
    {
      MinLength = arg->Length;
    }
  }
  return MinLength;
}

ありがとうございました。

888デフォルトの名無しさん2015/01/28(水) 22:20:24.42ID:NY0MHdg2
String^ selectedEmployee = (String^)(ComboBox1->SelectedItem);

^ってどういう意味?

889デフォルトの名無しさん2015/01/28(水) 22:43:41.32ID:CFOgWxxn
トラッキングハンドルって意味

890デフォルトの名無しさん2015/01/30(金) 16:37:12.12ID:w20faKmH
こらこら。
普通のC++でいうところの*だよ。

891デフォルトの名無しさん2015/02/06(金) 15:15:17.14ID:n2QXEqei
>>888
参照型

892デフォルトの名無しさん2015/03/01(日) 13:44:47.71ID:M4V41Yry
既存の native C++ のプログラムからC#で作ったdllを呼び出す必要が出てきたんで
/clrを使おうと思うんだが、.NETを使う部分以外のソースを全部 #pragma unmanaged
しておけば既存のnativeのプログラムと変わらないと考えていいのかな?
スタートアップに時間がかかったりするかもしれないけど。
それ以外になにか、純粋なnativeアプリと比べてのデメリットとかあるだろうか?

893デフォルトの名無しさん2015/03/03(火) 10:49:44.41ID:2xjYWNh7
拡張する度にpragma追加するのが面倒くさいからCOM exportのがいいよ

894デフォルトの名無しさん2015/03/03(火) 22:20:54.28ID:QODsipDB
COMはregistryやGACに登録しないとならないのが。それがなければ使いたいんだけど。
pragamはまぁ、stdafx.hに仕込んどけばいいだけなんで。
で、試してみて一応ビルドは通って、DependencyWalkerで見てもほとんど同じに見えたけど、
起動時に例外が出てうまく立ち上がらなかった。
どちらにしても、ビルドに時間がかかるんで普通にwrapperだけC++/CLIで作った方が楽そう。

895デフォルトの名無しさん2015/03/03(火) 23:37:18.31ID:TZKBUrl9
Register freeのcomが良い

896デフォルトの名無しさん2015/03/04(水) 00:00:58.99ID:1PNNe6DT
ほー、Interopでも登録なしで使えたのか。知らんかった。

897デフォルトの名無しさん2015/04/11(土) 23:36:34.69ID:rfVEU9W7
http://peace.2ch.net/test/read.cgi/tech/1420379468/279
から誘導されてきました。

質問です。

実行時にフォームをイベントごとコピーしたいのですが、
元のイベント関数のハンドラが取れず、上手く行きません。
解決策があれば教えてください。

やりたいこと:
チェックボックス等のフォームをデザイナで指定し、イベント関数もデザイナで指定します。
プログラムでこのチェックボックス等を10個ほどにコピーし、並べます。
このときにプロパティ等はコピーできますが、イベント関数がコピーできません。

理由:
位置決めが楽なので、デザイナ側で頭のFormは指定したいのです。
そして管理上分かりやすいので、イベントもそこに書いて、これをコピーしようとしています。
ところがEventInfo::GetRaiseMethodではnullが返ってきてしまいます。
ハンドラさえ取れれば以下と組み合わせて上手く行くと思うのですが。
https://msdn.microsoft.com/ja-jp/library/ms228976%28v=vs.110%29.aspx

状況:
なおC#だと以下で上手く行きます。
http://stackoverflow.com/questions/6055038/how-to-clone-control-event-handlers-at-run-time
ただしC++だと、GetField("events")がnullptrを返してくるので駄目です。
キーワードは色々試してみましたが、当たりませんでした。

前から困っている点で、とらいえずいちいち書いて対応していますが、
見ていて汚いので書き直したいと思っています。
気長に待っていますので、どなたか対策をご存じの方はレスよろしくお願いします。

898デフォルトの名無しさん2015/04/12(日) 03:07:38.87ID:UeaTPkyU
auto f = (Component::typeid)->GetField("events", BindingFlags::NonPublic | BindingFlags::Instance);
auto v = f->GetValue(checkBox1);
f->SetValue(checkBox2, v);

でふるまいが同一になるけど。

899デフォルトの名無しさん2015/04/12(日) 03:39:58.42ID:DBf5x0AF
>>898
お早い回答ありがとうございます。
こちらで確認した結果、確かに動きました。

(Component::typeid) のところを私は Component::GetType() にしていたのが敗因のようです。
見よう見まねでやっているため、実はここら辺のところがいまいち分かっていません。
お手数をおかけ致しました。また、ありがとうございました。

900デフォルトの名無しさん2015/04/12(日) 03:49:39.70ID:UeaTPkyU
Component::GetType() は Form の中でなら GetType() と同じ。
C++で親クラスのメソッド呼ぶときの文法よ。

901デフォルトの名無しさん2015/04/12(日) 10:00:53.76ID:DBf5x0AF
>>900
了解です。ありがとうございます。
FormがComponentを継承しているのを関知していませんでした。

9028972015/04/15(水) 19:57:16.10ID:F8+sQhgK
>>898
これ、少なくとも numericUpDown の ValueChanged イベントはコピーできないことが分かりました。
その他は不明です。
元々このやり方はどのドキュメントにも書いていないらしいので、文句は言えないのですが、
どなたか解決策をご存じであれば教えてください。

なお、Button の Click イベントについては、また別の解を見つけました。
似たようなものですが、keyが必要なようです。
http://stackoverflow.com/questions/293007/is-it-possible-to-steal-an-event-handler-from-one-control-and-give-it-to-anoth
ただ、Button Click 自体はこちらで試す限り、 >>898 でコピーできています。

903デフォルトの名無しさん2015/04/29(水) 20:01:07.13ID:3xtog1sc
マネージクラスのポインタを取得(pin_ptr)し、ネイティブクラスのポインタにキャストする方法を探しています。

class NativeClass
{
 int Hoge;
};

[StructLayout(LayoutKind::Sequential)]
public ref class ManagedClass
{
private:
 int mHoge;

public:
 property Int32 Hoge { Int32 get() { return this->mHoge; } }
};

mHogeがinternalの場合は下記でできますが、privateの場合はどう書けば良いのでしょうか?

ManagedClass^ managedClass = gcnew ManagedClass();
pin_ptr<int> pManagedClass = &managedClass->mHoge;
NativeClass* pNativeClass = (NativeClass*)pManagedClass;

904デフォルトの名無しさん2015/04/29(水) 23:24:10.23ID:wtD4uRPe
property const Int32% Hoge { const Int32% get() { return this->mHoge; } }
にすれば、&managedClass->Hoge が interior_ptr<const int> になるから後は適当にキャストすればいいんでは。

905デフォルトの名無しさん2015/04/30(木) 23:38:42.52ID:EZeUEJ9k
>>904
返信ありがとうございます。
トラッキング参照のプロパティはC#側で扱えなくなってしまうので避けたいです。
フィールドを参照しないと無理みたいなので、mHogeを公開するようにしようと思います。
ありがとうございました。

906デフォルトの名無しさん2015/05/01(金) 20:25:15.13ID:1uBqK3bl
知ってるかもだけど、ManagedClass が value class, value struct なら
pin_ptr<ManagedClass> を reinterpret_cast<NativeClass *> するのは安全だったはず…

907デフォルトの名無しさん2015/05/08(金) 23:36:54.66ID:V8hi9yRP
MessageBoxを親の中央に表示する簡単な方法はないですか?
自分でフォームを作ってしまえばいいんでしょうか?
最近までVC++6.0でMFCしか触ったことない自宅へぼプログラマです

908デフォルトの名無しさん2015/05/09(土) 21:01:16.72ID:sbTRo4x2
フックでメッセージボックスのハンドルを取得して移動するだけ

909デフォルトの名無しさん2015/05/19(火) 18:58:05.23ID:bujHJjw6
.NET Framework 4 で C++/CLI 混在モード アセンブリを使用すると、スレッドの生成・終了時にメモリ リークが生じる問題について
http://blogs.msdn.com/b/jpvsblog/archive/2015/05/18/mixedassembly-thread-leak.aspx

910デフォルトの名無しさん2015/05/20(水) 10:30:15.88ID:ugJdOWTQ
うちのPCだと4.5.2が入らないんだけども
http://mog.tank.jp/up/src/mog11197.jpg

911デフォルトの名無しさん2015/05/20(水) 22:52:40.74ID:2T6/P0Lm
>>910
そうそう、起動時なんか構成に失敗しましたとかでて毎回復帰がかかっている

912デフォルトの名無しさん2015/05/20(水) 23:36:56.86ID:DchNMAYq
休日プログラマです。

環境:Visual Studio 2012 express
SQLサーバ:SQL Server 2012 express

ODBCドライバを用いて、フォームから検索ワードを取得し、
C++/CLIでのプリペアドステートメントを発行して結果を取得したいのですが、
それを用いたlikeなど部分検索SQLの結果取得でハマったまま先に進めません。

SQLCHAR search[255];
std string sql = "select hoge, strhoge from hogetbl where strhoge like \%?\%";
SQLPrepare(hstmt,
(SQLTCHAR *) sql.c_str(),
,SQL_NTS);
SQLBindParameter(hstmt,1,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,sizeof(search),0,search,NULL);
SQLExecute(...

のように書いているのですが、プログラム上では何をやってもSQL_NO_DATAが返ります
あたりまえですがSQLそのものはServerのクエリで確認したところ通っています //?の所を'(任意文字列)'にした結果

また、SQL構文をLIKEの代わりにSQLのCHARINDEXを用い項目を増やして使ってみたのですが、同じようにダメでした。
// case when charindex(?,strhoge) > 0 then 1 else 0 end as searchflg ....
// where searchflg = 1 のように

ここには書き戻しできないのですが、escape句も試用したことがありますが、無理でした。
で、このLIKE以外は問題なく動きます。
また、他の機能はほとんどODBCで書いちゃったのでADOはやりたくないです。
何かいい方法ありませんでしょうか。よろしくお願いします。

913デフォルトの名無しさん2015/05/20(水) 23:56:15.34ID:/RusctZx
普通 '%' + ? + '%' とか書くんじゃないの。

9149122015/05/21(木) 00:02:48.74ID:6QiHBSDD
ああ、言い忘れていてすみません。
それもやりましたが、ダメでした

915デフォルトの名無しさん2015/05/21(木) 00:43:36.74ID:vrFpc8wu
コマンドには like ? と書いて、パラメータに%を指定するのはどう?

9169122015/05/22(金) 01:16:43.85ID:YmYYGDUM
うーん、それもやってみます。
あと、他の方はこうした事でハマったりは特にありませんでしたでしょうか。
書いてるのが一人でやってるのもあって、本当にプリペアドでの部分検索が可能かどうかが少し不安です
もちろん、突き詰めればなんでも可能なのでしょうけれども……

917デフォルトの名無しさん2015/05/22(金) 02:49:24.89ID:O8zMbXMa
SQLTCHAR* 型に std::string のポインタ渡してるのは、問題ないの?

9189122015/05/29(金) 21:54:54.52ID:ky+HtZPS
912です。>>917さんの意見も含め、別の観点からもみてみたところ
・・・非常にお恥ずかしいオチになったのですが、解決しました。

問題はコードではなく、BindParameter時のCHAR検索する箇所(SQL_CHAR)が
DB側でいつの間にかvarcharになっていたのが原因でした。合わせてやると簡単に使えるように…
みなさん、お騒がせして申し訳ありません。

9199122015/05/29(金) 22:03:04.73ID:ky+HtZPS
>>918
×CHAR検索する箇所(SQL_CHAR)がDB側でいつの間にかvarcharになっていた
○CHAR検索(SQL_CHAR)としていたのに、対象のDB側の項目の型がvarcharになっていた

920デフォルトの名無しさん2015/09/15(火) 21:43:10.94ID:sv5Bl9TI
質問です。

上手いことsscanfを.NETで実装する方法ってありますか?
ポインタが上手く渡せず困っています。

なお、正式に習ったわけではなく、見よう見まねでやっているため、
単純なところで勘違いがあるかもしれませんが、その時も指摘して頂けたら助かります。

921デフォルトの名無しさん2015/09/15(火) 21:43:39.42ID:sv5Bl9TI
【これまでの経緯】
プログラムが間延びしてきたため、
これまで個別にちまちま書いていたファイル読み出し部分をsscanfで纏めて整理しようとしています。
ググッたところ、.NETにはsscanfそのものはなく、どうやら皆さん苦労しているようでした。
http://stackoverflow.com/questions/4223917/c-sharp-equivalent-of-c-sscanf
http://stackoverflow.com/questions/492262/is-there-an-equivalent-to-sscanf-in-net
http://www.blackbeltcoder.com/Articles/strings/a-sscanf-replacement-for-net
ただ自分の場合はcsvの読み出しで順番と対象だけ指定できればいいので、
以下のように組んでみました。(ただしまだ動かしていないので動かないかもしれません)

private: int sscanf_csv(String^ str, String^ format, array<void**>^ pointers){
array<String^>^ strs = str->Split(',');
array<String^>^ fmts = format->Split(',');
int i=0;
while (i<strs->Length && i<fmts->Length) {
if (fmts[i]=="int") {
if (!Int32::TryParse(strs[i],(int%)pointers[i])) break;
} else if (fmts[i]=="double") {
if (!Double::TryParse(strs[i],(double%)pointers[i])) break;
} else if (fmts[i]=="float") {
if (!Single::TryParse(strs[i],(float%)pointers[i])) break;
} else if (fmts[i]=="string") {
*(interior_ptr<String^>)pointers[i] = strs[i];
}
i++;
}
return i;
}

Stringのところは怪しいですが、intとdoubleとfloatはネイティブなら問題ないと思っています。

922デフォルトの名無しさん2015/09/15(火) 21:44:06.10ID:sv5Bl9TI
【問題点】
・マネージドのクラスではメンバにネイティブ配列が使えないため、
書き込み対象にどうしてもマネージド配列の要素を指定することが必要となりますが、
interior_ptrをvoid**にキャストできません。
仕様上、interior_ptr → pin_ptr → int → void** にはキャストできる(っぽい)のですが、
 ・interior_ptrは配列に出来ない(array<interior_ptr<int>> も interior_ptr<int> hoge[] もエラー)
 ・pin_ptrも同様に配列に出来ない。さらにローカル変数として宣言しないと駄目っぽい。
ため、これらを回避するためにはベタにコードする必要があり、余計に見にくくなります。
・そもそも void** にしているのは可変長引数がいまいちだったからなのですが、
上記のように interior_ptr が配列に取れないから多分可変長も無理です。
・自分の場合は1行につきせいぜい10個程度の代入なので最悪べた書きでラップしてもいいのですが、
interior_ptr<Type>は型指定があり、型の順番は変更したいのでこれも厳しいです。

【出来ればいいなと思っている記述】
array<int> ary_int = gcnew array<int>(10);
array<double> ary_double = gcnew array<double>(10);
sscanf_csv(line0, "int,double", gcnew array<void**>(2){&ary_int[0], &ary_double[0]});
sscanf_csv(line1, "double,int", gcnew array<void**>(2){&ary_double[1], &ary_int[1]});

という感じです。良い案があればお願い致します。

923デフォルトの名無しさん2015/09/16(水) 11:35:11.25ID:L4xvtXb4
>922
ttps://gist.github.com/anonymous/db1149cb0a1afbd1f6d8

書いてて思ったけど、変に凝るよりも↓みたいな奴の方が読む人にやさしい…
auto x = gcnew CSV(line1);
ary_int[0] = x->read_int(0);
ary_double[0] = x->read_double(1);

924デフォルトの名無しさん2015/09/16(水) 21:00:32.05ID:sRYuFuHf
>>923
おお、ありがとうございます。
template<typename ... Ts>でTsはバラバラでもいけるんですね。知りませんでした。
あと、再帰で一つずつ剥がすのも思いついていませんでした。ググルと定番のようですがorz

> 書いてて思ったけど、変に凝るよりも↓みたいな奴の方が読む人にやさしい…
ちなみにその記述は今の状態です。
ただ、これだと抽象度が低いため記述量が増え、ちょっと保守性に問題を生じ始めています。
結局のところ、同じフォーマットの行を大量に処理して配列に突っ込むだけなので、
最終的には「ファイル名」「フォーマット」「対象配列」でよく、最上位からは(型情報ありなら)

parse_csv(filename, &ary0, &ary1, ...);

の1行にしたいのです。その下のファイル→行のところでコメント等をはがし、
delegateでparse_lineを呼ぶ算段でしたが、ポインタが渡せずに困っていました。
大変助かりました。ありがとうございました。


と思ったのですが、parameter pack はC++11の機能で、VS2013以降からのようです、、、
VS2015でそちらのコードが動作するのを確認しました。
自分が使っているのはVC++2008なので、この機会に移行を考えますorz
当面はせいぜい10個なのでunpackしたものを自分で書きますが、、、

925デフォルトの名無しさん2015/09/16(水) 21:06:19.21ID:sRYuFuHf
すいません、やや話が前後しているので念のため一部訂正します。

元々 delegate から parse_line を呼ぶつもりでしたが、
最終的には可能なら parse_csv に纏めようとしています。
ただ parameter pack が使えないとやっぱキツいですね、、、

926デフォルトの名無しさん2015/09/16(水) 22:14:50.26ID:L4xvtXb4
行によってフォーマットが違わない(ファイルによっては違うのかな)のなら、
行をパースした結果の型を定義しちゃったほうが保守性は上がると思うけど、縦方向の配列が必要なんだろうなぁ。

927デフォルトの名無しさん2015/09/16(水) 22:41:51.71ID:sRYuFuHf
>>926
はい、ファイルによってフォーマットは違い、行では変わりません。
演算ソースを読み込むのに使うので、速度は遅くても構いません。

ただ一部、各行の先頭数値によって行のフォーマットを変えている部分があるため、
元々はメンバ関数内で parse_file を呼び、フォーマット毎の parse_line を delegate で渡すつもりでした。
ただこれはソースファイルが増えるのが面倒なので一部にパッチを当てたからであり、
きちんと修正すれば parse_file に一本化できるので、この方向で検討中です。

実は縦方向の配列は不要で、各行での構造体化も検討中です。

928デフォルトの名無しさん2015/09/16(水) 22:55:17.14ID:sRYuFuHf
すいません、また細かいところで間違えました。一応念のため訂正しておきます。

× 元々はメンバ関数内で parse_file を呼び、フォーマット毎の parse_line を delegate で渡すつもりでした。
○ 元々は上位で parse_file を呼び、対象オブジェクトのメンバ関数を delegate で渡し、
 メンバ関数内で先頭数値を見てフォーマットを区別し、そこから parse_line を呼ぶつもりでした。(現時点で動作中)

今は上位で メンバ関数 Hoge.init(filename) を呼び、init内で全部済ませる方向です。

これまで全くオブジェクト指向をしておらず、それでも大して問題なかったのですが、
いい加減無理になってきたので、今更ながら粗結合化をやろうかというところです。

929デフォルトの名無しさん2016/02/15(月) 00:11:59.92ID:BuMWAFI4
「System.Collections.Generic.List<T>型」を「LPARAM型」に変換する方法、
またその逆の変換をする方法、を教えて下さい。

List<T>型をLPARAM型に変換する必要があり、
その後で、List<T>型をLPARAM型から再取得する必要があるのです。

930デフォルトの名無しさん2016/02/15(月) 01:15:53.23ID:Rn1JhND3
「その後で」がスコープを抜けた後を意味するなら、そのような方法はありません。

931デフォルトの名無しさん2016/02/15(月) 07:40:32.53ID:7IG9/wk9
marshal_as を実装すればいいと思うよ。
LPARAM って実体は void** じゃなかったっけ

932デフォルトの名無しさん2016/02/16(火) 07:41:35.26ID:uJkK1HCP
>>931
言語はC++ cli です。

msclr::interop::marshal_context mct;
LPARAM lParam = mct.marshal_as<LPARAM>(this->child_window_list);
↑で実装すると↓のコンパイルエラーとなります。
error C4996: 'msclr::interop::error_reporting_helper
<_To_Type,_From_Type>::marshal_as':
This conversion is not supported by the library or the header file needed for this conversion is not included. Please refer to the documentation on 'How to: Extend the Marshaling Library' for adding your own marshaling method.

またList<T>型をLPARAM型に再変換する方法が分かりません。

933デフォルトの名無しさん2016/02/16(火) 09:54:31.98ID:jv0CDqht
経緯を見ずに
子ウィンドウリストの扱いとして妥当とは思えないが

934デフォルトの名無しさん2016/02/16(火) 15:12:48.61ID:l0bB/6+q
LPARAMの使い道がEnumWindowsの第二引数とかだったらやりようがあるけど、そういうコードではない?

935デフォルトの名無しさん2016/02/17(水) 07:42:51.53ID:6vFi9dMa
解決しました。
c++の世界で一時変数を設けて、ポインタを渡し、reinterpret_castで復元する、という方法です。

936デフォルトの名無しさん2016/02/18(木) 02:54:21.18ID:/SXXA+KN
(たぶん解決してないなー、と皆が思ってる)

937デフォルトの名無しさん2016/02/20(土) 19:06:01.50ID:HOPxSzsv
質問です。
+= で追加したフォームのイベント順を入れ替えたいのですが、やり方はありますか?

条件
1. デザイナは使いたい(既に大量に使っている)
2. 格好悪い書き方で全く問題ないが、全体的に書き直すのはNG

状況
numericUpDown->Changed 等に対してデザイナ上から再描画関数を割り当てています。(A)
(波形を表示する時のボリュームのような使い方です)
デザイナではフォームはデフォでは static でないため、
内部の別クラスからは numericUpDown->Value 等にはアクセスできません。
(自分でstaticと書いてコンパイルを通すことは出来ますが、デザイナで変更するたびに戻されます)
そこでイベントに別関数も割り当て、そこで内部 static struct に Value 等を書かせ、(B)
別クラスからはこの static struct を参照しています。

このとき、AとBの経路が完全に分離しているうちはよかったのですが、
統合していくうちにA内部から別クラスを呼ぶことが発生し、 static struct が未更新なのでバグっています。
イベントは追加順に呼ばれるようです。
デザイナで指定したイベント関数はフォーム生成時に指定される為、必ず A->B の順で呼ばれることになります。
これを B->A の順に入れ替えたいのですが、方法はありますか?

938デフォルトの名無しさん2016/02/20(土) 19:06:30.87ID:HOPxSzsv
プログラムイメージ
Form^ someForm; // デザイナで作成したため、static ではない
someForm->Changed += 再描画関数; // (A)
someForm->Changed += struct更新関数; // (B)

static ref struct FormData {
Decimal someForm_value;
} formData;

function struct更新関数(){ // (B)
formDataを更新
}
function 再描画関数(){ // (A)
formDataを使う別クラスを使用 // formDataは未更新なのでバグる
}

やってみたこと
numericUpDown->Changed = Delegate::Combine(struct更新関数, 再描画関数); // 上書き再設定しようとしたが = は使えない
どうやら +=(add) と -=(remove) しかないので、(中身を参照できない)
一つずつ array<Delegate^> に吸い出して += で希望順にちまちま再設定も出来そうにありません。
全部の(A)の頭に(B)を追加してイベント経路を一本化すればいいのは分かりますが、
これは大量に書き換えが必要となります。
今現在(B)は後付で全てのフォームを列挙して追加しています。
この部分だけの変更に留められるのならそうしたいのです。
リフレクションも試しましたが、以下でeventInfoは取れますがその先に進めません。
System::Reflection::EventInfo^ eventInfo = (NumericUpDown::typeid)->GetEvent("ValueChanged");

以上、よろしくお願い致します。

939デフォルトの名無しさん2016/02/21(日) 05:32:00.14ID:SNLM1Bng
> デザイナではフォームはデフォでは static でないため、
> 内部の別クラスからは numericUpDown->Value 等にはアクセスできません。

ここで結果と原因の理解が食い違ってるので設計が悪くなってるのでは。

FormDataはstaticにせずForm1のメンバにして、その中身が変化したときのイベント
(ここに再描画関数を += して、EventArgsでパラメータを渡す)を足すのが良いのでは。

940デフォルトの名無しさん2016/02/21(日) 12:45:43.68ID:Ur7lNYiz
>>939
回答ありがとうございます。

それでも解決しますが、それは全面改訂になります。
既に(B)を全ての(A)の頭に入れるという解決策はあり、それの方がデグレードの危険が少ないです。
ただ、リフレクション等で(B)と(A)の順を入れ替えられると、数行の変更で済み、デグレードは発生しません。
だからそれを探しています。

Form1と別クラスCを追加して再度説明します。
全てはForm1の内部クラスです。継承はしていません。

941デフォルトの名無しさん2016/02/21(日) 12:46:15.32ID:Ur7lNYiz
【今】
ref class Form1{
Form^ someForm; // デザイナで作成したため、static ではない
someForm->Changed += 再描画関数; // (A)
someForm->Changed += struct更新関数; // (B)

static ref struct FormData {
Decimal someForm_value;
} formData;

function struct更新関数(){ // (B)
formDataを更新
}
function 再描画関数(){ // (A)
// struct更新関数() // (B)を += せずにここに入れれば解決する、ただし変更箇所多数
formDataを使う別クラスCを使用 // formDataは未更新なのでバグる
}
ref class 他のクラスC {
描画用データ作成 // ここで someForm->Value を使いたいが直接には出来ないので仕方なく static formData を確認
}
};

問題点:
クラスCから someForm->Value が取れないので static struct FormData で誤魔化す。
ただしこれだとイベント順が「描画(A)」→「データ更新(B)」となり、描画内容が1イベント分ずれる。
このため、(B)と(A)の処理順を入れ替えたいが、方法が見あたらない。

942デフォルトの名無しさん2016/02/21(日) 12:46:44.50ID:Ur7lNYiz
>>939の提案】
ref class Form1{
Form^ someForm; // デザイナで作成したため、static ではない
someForm->Changed += struct更新関数; // (B)

ref struct FormData { // static ではない
Decimal someForm_value;
} formData;
formData->someForm_value->Changed += 再描画関数; // (A) // 自作クラスFormDataにChangedイベント追加

function struct更新関数(){ // (B)
formDataを更新
}
function 再描画関数(){ // (A)
formDataを使う別クラスCを使用 // formDataは常に更新済み、formDataを呼び出し時に渡す
}
ref class 他のクラスC {
描画用データ作成 // formData を参照
}
};

問題点:
イベント処理順は「データ更新」→「描画」と正しく固定される。
ただし全面改訂になる。

943デフォルトの名無しさん2016/02/21(日) 12:47:27.88ID:Ur7lNYiz
> ここで結果と原因の理解が食い違ってるので設計が悪くなってるのでは。
結果: 描画に使われるデータが1イベント分ずれる
原因: イベント順が「描画」→「データ更新」だから
何か間違いはありますか?

データ構造としては本来は class Form1 : FormData となるべきため、
static で使うことも問題ないと思います。
既に記述されて動いているプログラムがあり、それを変更しようとしています。
データ更新→描画にプログラム上で固定するのはスクラッチからなら当然ですが、その場合にも結局
「どのデータが更新されたか→どの部分を再描画する必要があるか」を記述する必要があります。
この部分は今既にデザイナ上にあり、動いているので、それをそのまま利用する方法を探しています。

944デフォルトの名無しさん2016/02/21(日) 20:54:36.76ID:SNLM1Bng
結果:アクセスできない
×原因:staticじゃないから
○原因:設計が悪いから

http://www.c-sharpcorner.com/uploadfile/b81385/how-to-change-order-of-event-handlers-execution-at-run-time/

リファクタ無理だというならここにあるC#のコードをC++/CLIに移植すればよいのでは。

945デフォルトの名無しさん2016/02/22(月) 00:23:23.86ID:GxEKSJ9o
リンク先のコードでイベント順を入れ替えることが出来ました。
ありがとうございました。

プログラム構造については色々意見はあるとは思いますが、
最初から固まっている仕様に対して一度作って終わりなら誰も苦労しませんよ。
複数有る解決策のうち、今現在見える範囲での最適解をその都度選んでいくしかありません。

A. イベント順を入れ替えても
B. 各イベントハンドラの頭にデータ更新を挿入しても
C. 他クラスに対していちいちForm1オブジェクトを渡してstaticではなくしても

制御フローは同じです。(切り出し面が異なるだけ)
今後FormDataクラスや「他のクラスC」はForm1外でも使う可能性があるのと、
デグレードに対するデバッグの困難さを考えて、今回はAを選んでいるだけです。

まあいずれにしても、解決しました。
ありがとうございました。

なおリンク先、最後に小言が書いてありますが、完全に同意ですよ。
本来はイベントテーブルを参照できるメソッドが有ればいいだけです。

946デフォルトの名無しさん2016/02/23(火) 04:03:35.79ID:zeSeypn1
本来はまともな設計をすればいいだけだよ
+= した順番に呼ばれるのもたまたまそういう実装になってるだけでしょ

947デフォルトの名無しさん2016/02/29(月) 00:09:05.42ID:MKA4zt/L
イベントの実行順はaddされた順だと仕様化されてる

948デフォルトの名無しさん2016/04/25(月) 16:38:42.40ID:FkG7uZgr
質問失礼します。

'abc.exe': 'C:\Visual Studio 2008\Projects\xyz.dll' を読み込みました。Cannot find or open the PDB file
'abc.exe': 'C:\Visual Studio 2008\Projects\xyz.dll' をアンロード

このアンロードはどうやって止めるのでしょうか?

実行した際に、dll内のメソッドを参照できないようで、以下のエラーとなります。
ハンドルされていない例外: System.IO.FileNotFoundException: ファイルまたはアセン
ブリ 'hoge.dll'、またはその依存関係の 1 つが読み込めませんでした。
指定されたモジュールが見つかりません。
場所 hoge.hogeclass..ctor()
場所 main(Int32 argc, SByte** argv)
場所 _mainCRTStartup()
コンパイルはできています。

よろしくお願いします。

(なんか急にできなくなった気がします。前は、問題無だったはずなのになぁ)

追記

他にも、以下のような、謎のメッセージも出ています。

'abc.exe': 'ImageAtBase0x10000000' を読み込みました。含める/除外する設定により、読み込みは無効になっています。
'abc.exe': 'ImageAtBase0x10000000' をアンロード

よろしくおねがいします。

949デフォルトの名無しさん2016/04/26(火) 04:22:33.77ID:GzSuYmQg
「cannot find or open the pdb file c++」で検索!

950デフォルトの名無しさん2016/04/26(火) 10:52:45.55ID:wKiIgsat
アンロードは気にするな
dllの場所をあちこちコピーして試してみ

9519482016/04/27(水) 15:26:32.30ID:pZs1yVgK
思い出しました。

ildasm,ilasmをつかって、その該当のdllのPCBを作りました。
(dllの中まで、デバッガで追いかけるためです)
あたらしくコンパイルしたDLLへ、前のPCBがなかったものから、リンクを張り替えました。

そしたらエラーが出るようになった気がします。
(あくまで、気がするだけです。なんら、確かな関連はわかりません)

しかし、現在は、以前のオリジナルのDLLをリンクしています。
その状態でエラーが出ています。

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

/LIBPATH の場所
exeと同じフォルダ
program filesフォルダのvisualSTUDIOフォルダ

それらに置き直しました。が、駄目でした。

952デフォルトの名無しさん2016/04/27(水) 16:32:56.37ID:P7l59W4J
xyz.dllが依存している何かのDLLが見つからないんじゃないの
dependency walkerとかcygwinのlddとかで確認してみたら

953デフォルトの名無しさん2016/04/27(水) 17:53:59.20ID:VZ0i7jHG
参照設定に入れてるんじゃないの?
一旦外して参照設定しなおしてみては

9549482016/04/27(水) 18:59:04.66ID:1t3mn4AU
'newxyz.exe': 'C:\Documents and Settings\company\My Documents\Visual Studio 2010\Projects\newxyz\Debug\newxyz.exe' を読み込みました。シンボルが読み込まれました。
'newxyz.exe': 'C:\WINDOWS\system32\ntdll.dll' を読み込みました。シンボルは読み込まれました (ソース情報は取り除かれました)。
-----------------------------------------省略
'newxyz.exe': 'C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Culture.dll' を読み込みました。シンボルは読み込まれました (ソース情報は取り除かれました)。
'newxyz.exe': 'C:\WINDOWS\assembly\NativeImages_v4.0.30319_32\mscorlib\cece9d0256e18427b64587ba690605d4\mscorlib.ni.dll' を読み込みました。シンボル ファイルにネイティブ シンボルがありません。
'newxyz.exe' (マネージ (v4.0.30319)): 'C:\WINDOWS\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll が読み込まれました。シンボルが読み込まれました。
ー---------------省略
'newxyz.exe' (マネージ (v4.0.30319)): 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll が読み込まれました。シンボルが読み込まれました。
'newxyz.exe': 'ImageAtBase0x10000000' を読み込みました。含める/除外する設定により、読み込みは無効になっています。
'newxyz.exe': 'ImageAtBase0x10000000' をアンロード
'newxyz.exe' (マネージ (v4.0.30319)): 'C:\Documents and Settings\company\My Documents\Visual Studio 2010\Projects\newxyz\Debug\xyz.dll' が読み込まれました
'newxyz.exe': 'ImageAtBase0x10000000' を読み込みました。含める/除外する設定により、読み込みは無効になっています。
'newxyz.exe': 'ImageAtBase0x10000000' をアンロード
----------------続きがあります
----------------続きがあります

9559482016/04/27(水) 19:01:17.20ID:1t3mn4AU
'newxyz.exe': 'C:\Documents and Settings\company\My Documents\Visual Studio 2010\Projects\newxyz\Debug\netClient.dll' を読み込みました。Cannot find or open the PDB file
'newxyz.exe': 'C:\Documents and Settings\company\My Documents\Visual Studio 2010\Projects\newxyz\Debug\netClient.dll' をアンロード
newxyz.exe の 0x7c812aeb (kernel32.dll) で初回の例外が発生しました: Microsoft C++ の例外: EEFileLoadException (メモリの場所 0x0012d0e8)。
----------省略
'System.IO.FileNotFoundException' の初回例外が newxyz.exe で発生しました。
'newxyz.exe': 'C:\WINDOWS\system32\version.dll' を読み込みました。シンボルは読み込まれました (ソース情報は取り除かれました)。
'System.IO.FileNotFoundException' のハンドルされていない例外が newxyz.exe で発生しました。

追加情報: ファイルまたはアセンブリ 'netClient.dll'、またはその依存関係の 1 つが読み込めませんでした。指定されたモジュールが見つかりません。

'newxyz.exe' (マネージ (v4.0.30319)): 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\mscorlib.resources\v4.0_4.0.0.0_ja_b77a5c561934e089\mscorlib.resources.dll' が読み込まれました
スレッド 'メイン スレッド' (0xe48) はコード 0 (0x0) で終了しました。
スレッド 'Thread::intermediateThreadProc' (0xec8) はコード 0 (0x0) で終了しました。
スレッド 'HelperCanary::ThreadProc' (0xec4) はコード 0 (0x0) で終了しました。
プログラム '[3652] newxyz.exe: ネイティブ' はコード 0 (0x0) で終了しました。
プログラム '[3652] newxyz.exe: マネージ (v4.0.30319)' はコード 0 (0x0) で終了しました。

9569482016/04/27(水) 19:13:09.09ID:1t3mn4AU
>>952
>>953
みなさん、ありがとうございます。

952さんのおっしゃる方法でいけました。

dependency walkerで、不足していたDLLが発見できました。

VSで、もし不足DLLがあるなら、教えてくれるはずだ」という、
思い込みが駄目でした。

3日*5時間=15時間

ぐぐたり、最インストして、時間をつぶしました。

(エラーコードを貼り付けたけど、無駄になっちゃた)

957デフォルトの名無しさん2016/05/01(日) 16:47:47.97ID:tKi6j9CT
匿名通信(Tor、i2p等)ができるファイル共有ソフトBitComet(ビットコメット)みたいな、
BitTorrentがオープンソースで開発されています

言語は何でも大丈夫だそうなので、P2P書きたい!って人居ませんか?

Covenantの作者(Lyrise)がそういう人と話したいそうなので、よろしければツイートお願いします
https://twitter.com/Lyrise_al

ちなみにオイラはCovenantの完成が待ち遠しいプログラミングできないアスペルガーw


The Covenant Project
概要

Covenantは、純粋P2Pのファイル共有ソフトです

目的

インターネットにおける権力による抑圧を排除することが最終的な目標です。 そのためにCovenantでは、中央に依存しない、高効率で検索能力の高いファイル共有の機能をユーザーに提供します

特徴

Covenant = Bittorrent + Abstract Network + DHT + (Search = WoT + PoW)

接続は抽象化されているので、I2P, Tor, TCP, Proxy, その他を利用可能です
DHTにはKademlia + コネクションプールを使用します
UPnPによってポートを解放することができますが、Port0でも利用可能です(接続数は少なくなります)
検索リクエスト、アップロード、ダウンロードなどのすべての通信はDHT的に分散され、特定のサーバーに依存しません
1w

958デフォルトの名無しさん2016/10/22(土) 11:55:32.76ID:ksoZ+Sju
大分人が居ないみたいだけど、質問させてください

archlinux(x86_64)+gtkmm3(3.22.0)+epoxy(1.3.1)+glsl上のOpenGLで隠面消去をしたいのですが
glEnable(GL_DEPTH_TEST)しても上手く行きません。fragment shaderの部分で書くのでしょうか?
もしサンプルなど有りましたらURLを教えて頂ければ幸いです。

OpenGL、GLSL周りの情報は何処を見て何処を出せば良いのか分からず不明ですが宜しくお願いします

少し問題の発端を・・・
以前はgtkmm3+glewで某ホームページで点にテクスチャを貼って大きさを変える方法を利用してました
(1) gtkのアップデート → context周りが上手く機能せず
(2) GLAreaクラス使用する → オプションとか無効なものが発生、描画命令が上手く動かない
(3) GLSLを使うようにする → アルファテストは何とか解決、隠面消去が実装方法が分からず
※オンボード(core i7 4771)のグラフィックを使っているせいかGLSLのバージョンも1.3以上にできないみたいです

959デフォルトの名無しさん2016/10/22(土) 12:52:21.05ID:O48rD9qT
おおいたじん

960デフォルトの名無しさん2016/10/23(日) 21:52:15.85ID:15UOA6Kp
わかったぁぁぁぁ!!!

glEnable( GL_DEPTH_TEST );
ではなく
set_has_depth_buffer();
でデプスバッファを有効にするみたいだ
こんな所まで変える必要はないだろうに・・・

961デフォルトの名無しさん2016/10/23(日) 23:42:58.00ID:dKDci2rB
すれ違いな事を分かれよw

962デフォルトの名無しさん2016/10/24(月) 00:49:08.07ID:B3VSjKub
いや誘導されてきたしw
普通のくだすれ落ちてるし
スレ立てるまでもないスレの方が良かったのかな?

963デフォルトの名無しさん2016/10/24(月) 08:15:21.68ID:q3Pt9cuW
「くだすれ行け」って言われてこのスレに誘導されたと思ったんなら頭悪すぎるわ。

964デフォルトの名無しさん2016/10/24(月) 10:37:31.81ID:9xygNeDa
>>963
ほんそれ

965デフォルトの名無しさん2016/10/24(月) 12:49:59.59ID:e0+jKQlJ
まあ /CLI の文字はわからない人には見えないからな

966デフォルトの名無しさん2016/10/24(月) 15:51:40.64ID:9xygNeDa
くだすれC++だったとしてもスレ違い

967デフォルトの名無しさん2016/11/03(木) 11:44:11.90ID:s4829peE
C#で言うオブジェクト初期化子に相当する機能ってC++/CLIに用意されているんですかね?

getアクセッサしかないプロパティをコンストラクト時に初期化して使うようになっている
ライブラリがあったんですけど、もしかしてそういうクラスはC++/CLIから使えない?

968デフォルトの名無しさん2016/11/03(木) 16:15:49.29ID:997Gjnyn
{ hoge : 774, fuga : 37564 } { .hoge = 774, .fuga = 37564 } みたいなやつ?
俺も2015で以前に探したけど見つからなかったな

どうなんだろうね、あるのかな

969デフォルトの名無しさん2016/11/03(木) 16:49:50.16ID:s4829peE
それです。
VBには追加されているみたいだけど、C++/CLIは見捨てられているなぁ。

970デフォルトの名無しさん2016/11/03(木) 17:54:07.51ID:997Gjnyn
VSの作りからして、それはないんじゃないかな
MFCでリボンじゃない方のドッキングのプロジェクト作るとわかるけど、
あれがものの見事にVSのドッキングだからね
かつデザイナは当然ユーザが生成する(した)フォームは(特にユーザコンポーネント)
.NETでビルドされたものをデザインタイム用に直接呼び出してる
(デザイナでエラーが出るだのインテリセンスが良く落ちるだの言ってるのは
VSの作りを”なんとなく”ですら理解できてない証拠)

MSとしてはVSで次のVSを作ったりする為にもC++/CLI作りこみたいけど
非常に言語体系が複雑かつ莫大な工数が必要で追いついてないんじゃないかなと妄想
既に市場のソフトウェアの価格破壊はとっくに完了
後はストアかUbuntuOnLinuxでサーバ市場か開発シェアで食い込むしかなさそうだし

971デフォルトの名無しさん2016/11/08(火) 19:00:23.92ID:poFN3OHs
亀レスだが何となく妄想が閃いた

MS主導とはいえ、C++/CLIってなんかの国際的な規格みたいなので規定された
れっきとした規格だからおいそれと追加できないんだ
んで、C#もC++も構造体(クラス)の初期化子持ってるから昔みたいな適当に
「MS独自の拡張でーす」とかやっちまうと収拾つかなくなりそう

とはいえ { 0, ,1 2 } は後からメンバ追加したとき修正忘れとかトラブルの元だし
構造体宣言→ZeroMemory→b=1; c=2;はエイリアス切らないとconst修飾できねーし
(エイリアスはヒューマンエラーの元、constじゃないと最適化掛からないケースあり)
さっさと対応して欲しいとこではある

972デフォルトの名無しさん2016/11/08(火) 22:29:24.78ID:ygc/1hMy
混在アセンブリが作れるのはC++/CLIだけだし非常にもったいないと思うんだが、
MS自身も既にグルー用途以外での新規採用を推奨してなかったんじゃないかな。
もうちょっと力入れてくれてたらMFCなんか捨てられたのに。

973デフォルトの名無しさん2016/11/08(火) 22:58:35.07ID:poFN3OHs
ttps://support.microsoft.com/ja-jp/kb/3001686
これかな

そのわりにはVSには使ってんだよな
MFCしながらマネージコードをデザインタイムで呼び出してフォーム表示しなきゃならんから
仕方ないのかも知れんけど

974デフォルトの名無しさん2016/11/09(水) 11:18:35.06ID:YhV0EIhT
さりげなくVS2015でMFC進化してたし、MFCのダイアログでスプリッタとか
(無理やり空のCFrameWnd貼り付けるとタブ移動できない)
ステータスバーとか(.NETみたいにツールバーもどきとしても使える)
.NETでしか使えないコントロールが軒並みMFCにきてくれたりするだけでもいいんだけど
これから先C++/CLIのサポートどうなるんだろ
多少見てくれやUIが前時代的でもMFCの方が安定かなぁ

975デフォルトの名無しさん2016/11/21(月) 13:25:25.73ID:YpzsObn3
MSはCLI推奨せずにC#やVB推奨してっけど、将来のOffice系何で作るんだろな
難読化してもその内ソースのオプティマイザ出てきてイタチごっこになりかねんし暫くはMFCかね

976デフォルトの名無しさん2017/01/15(日) 21:23:48.23ID:rvU554U6
C++/WinRT なんてものまで出てきて、C++/CX も先が短そう
WTL の再来っぽくていい感じだけど

977デフォルトの名無しさん2017/01/15(日) 22:42:58.04ID:NxAjVWZ/
どれか一本に絞ってくれんと安心して規模がでかいモノに使えんのだよな

978デフォルトの名無しさん2017/01/16(月) 17:58:46.48ID:YH2Bx58z
うむ

979デフォルトの名無しさん2017/01/26(木) 18:08:08.58ID:o7A7h/DB
コロコロ変えて無駄な需要を作り出すのもM$の仕事

980デフォルトの名無しさん2017/01/30(月) 00:52:58.91ID:WdnkMvUJ
C++/WinRT をちょっと使ってみたけど、これいいね
標準C++で WinRT の COM 定義をインクルードして普通に使えるのはいい
癖さえつかめば、あとはWinRTのお作法だけってかんじだわ

981デフォルトの名無しさん2017/01/31(火) 15:17:17.52ID:KYCEEpNK
une

982デフォルトの名無しさん2017/02/01(水) 02:50:30.54ID:L9Dup9x5
UWPとか限定せずに、C++/CLIのまま突っ走って欲しかったんだがなぁ

983デフォルトの名無しさん2017/04/28(金) 09:31:56.32ID:O7EFHLbG
フォームアプリ用のプロジェクトのテンプレどっか落ちて無い?
毎回手動で設定するの面倒臭い。

984デフォルトの名無しさん2017/05/20(土) 14:40:24.30ID:EW+Ld+8h
アンマネージ側でvector<>に格納されたデータをマネージ側に返すには
gcnewで別にメモリ確保してコピーしてから返す方法になるんですか?
(一時的に倍メモリ使うのが気になります)

985デフォルトの名無しさん2017/05/20(土) 15:14:59.81ID:elFKlvRa
俺はあまり詳しくないけど、「返す」ってのが普通は要らないと思う。
マネージドからアンマネージドは直叩き出来るし、普通はそうする気が。
切り替えのオーバーヘッドがーみたいな記述もどこかにあったけど、
俺がやっている限りでは無駄命令は出ずに直叩きしてた。

逆にアンマネージドからマネージドも一応は直叩き出来るけど、
pin_ptrにしなければいけないし、可変長は多分無理。
STL/CLRにもvectorはあるけど、こちらだとアンマネージド側のソース変更が必要になる。
(*を^に変更)
だから一番楽なのは上記の「マネージドからアンマネージドを直叩き」だと思う。

なおコピーするのならそりゃ一時的には倍メモリ使うしかないでしょ。

986デフォルトの名無しさん2017/05/21(日) 00:02:49.54ID:B5VLs+I5
collection_adapterの出番だ!って思ったら逆方向だったでござる

新着レスの表示
レス数が950を超えています。1000を超えると書き込みができなくなります。
レスを投稿する