くだすれC++/CLI(初心者用)part2
■ このスレッドは過去ログ倉庫に格納されています
0001./1256645713/662
2010/03/15(月) 09:41:19C++/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
0002./1256645713/662
2010/03/15(月) 09:45:45System::String(char*); が正解ってことか?
それとも SByte が signed char ではなくて char てこと?それは無いような気が。
ちなみに、使ってる教科書のサンプルプログラムは8bitでは char* 配列を渡してる。
0003デフォルトの名無しさん
2010/03/17(水) 19:44:10検索しても意味不明なものしか引っかからない
0004デフォルトの名無しさん
2010/03/17(水) 21:02:17C++/CLIって。
0005デフォルトの名無しさん
2010/03/17(水) 21:41:39だからなんなんだ?
0006デフォルトの名無しさん
2010/03/17(水) 22:37:29LINKにある。
/KEYCONTAINER /KEYFILE
0007デフォルトの名無しさん
2010/03/17(水) 22:45:13基本的に使わないほうがいい
0008デフォルトの名無しさん
2010/03/18(木) 00:33:170009デフォルトの名無しさん
2010/03/18(木) 09:03:310010デフォルトの名無しさん
2010/03/22(月) 19:23:41どんな方法があるでしょうか?
今までは強引にチェックボックスにチェックが入ると
void test(System::Windows::Forms::TextBox^ tb_log_view);
こんな感じの関数呼び出してTextBoxを強引にわたして指定の処理して
テキストボックスにメッセージ表示させてたんだけど
何せ使い勝手が悪いので・・・
0011デフォルトの名無しさん
2010/03/25(木) 01:29:180012デフォルトの名無しさん
2010/03/25(木) 18:00:01C#で使おう」という目的に向けて、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#版を使ってます。
0013デフォルトの名無しさん
2010/03/25(木) 18:34:20Cさえ理解していないのがよくわかる。
0014デフォルトの名無しさん
2010/03/25(木) 18:45:45泣ける・・・・orz
回答有難うです
0015デフォルトの名無しさん
2010/03/25(木) 18:53:51配列はC++/CLIでアロケーションしていいのかとか。
C#でいう構造体はvalue class (or struct)であって、ref structはクラスだけどどっちにしたいのとか。
001612,14
2010/03/25(木) 19:13:48現状は、Cの方には手を加えないように、やる方法として、C++/CLIで
ラッピングするという手段があるという事なので、作業している次第。
そこで、構造体のポインタを戻り値としている関数はどう扱えば?と
思ってましたら、
http://ap.atmarkit.co.jp/bbs/core/fdotnet/17380
このような話をみつけたので、まずはref structでやってるという状況です。
0017デフォルトの名無しさん
2010/03/25(木) 20:50:34001812,14
2010/03/26(金) 09:55:14説明不足でした。
(当然の疑問ですよね)
そのCのライブラリというのが、元がスタティックしか考慮されておらず、
DLL用にはなってなく(__declspec(dllexport)のような記載は一切なし)、
選択肢として
1 Cのソースをdll対応に修正(__declspecを全関数に追加)
2 元のCには手を加えず、新しくラッパーを作る
があり、今後もCの方は勝手にバージョンが上がっていくので、
それなら、元のソースに手を加えない方向でやろうとなった次第です。
0019デフォルトの名無しさん
2010/03/26(金) 10:26:08Cで薄ーいラッパー書いて普通のネイティブDLLとしてコンパイルすればおk
C++のライブラリとなると面倒だけどそうでないならC++/CLIはできるだけ避けたほうが賢明
002012,14
2010/03/26(金) 12:05:28その手がありましたか!
C#でDllImportして、
DLL関数に渡す構造体、DLL関数から受け取る構造体は
[StructLayout(LayoutKind.Sequential)]を用いてC#側に定義して
やりとりするという事ですね。
試してみます
0021デフォルトの名無しさん
2010/04/25(日) 20:06:11Form1とForm2があり、Form1からForm2を呼び出すようにしています。
また、Form2に配置したボタンを押すと関数が呼び出されて、所望の処理をするようにしています。
以下の2点について教えてください。
1.関数内の処理の進捗をForm2内のLabelやProgressBarに表示したいです。
2.Form2からForm1を操作したい(Form2のボタンを押すとForm1/Form2ともに終了するようにしたい)です。
両方ともポインタを使えば出来そうな気がするのですが、例えば2.の方ではForm2を指すポインタの宣言の仕方が
わからないです。
よろしくお願いします。
0022デフォルトの名無しさん
2010/04/25(日) 20:24:49ポインタじゃなくて参照になる。
Form2^ form2;
0023デフォルトの名無しさん
2010/04/25(日) 20:26:28動くかどうかは試してない。
【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();
}
002421
2010/04/25(日) 23:09:54ありがとうございます。
残念ながらうまくいかないです。
環境は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();にあたる部分)がコンパイルエラーになってしまいます。
0025デフォルトの名無しさん
2010/04/27(火) 01:31:54> 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で確認
0026デフォルトの名無しさん
2010/06/07(月) 09:58:49ハンドラ設定してるのに動いてくれない
例えば_tcsftime(..., L"%h", ...);みたいなやつ
※普通の例外じゃないんで、マネージand/orネイティブでもtry catch出来ない
0027デフォルトの名無しさん
2010/06/09(水) 20:43:17> 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 ) );
> だからデバッグ時だけの話じゃん。
0028デフォルトの名無しさん
2010/06/10(木) 10:35:20つ 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;
}
0029デフォルトの名無しさん
2010/06/10(木) 13:07:440030デフォルトの名無しさん
2010/06/14(月) 22:16:23・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]);
}
}
0031デフォルトの名無しさん
2010/06/26(土) 12:09:02全コンストラクタでやりとりするようなマンドクセ方法がいやだ
0032デフォルトの名無しさん
2010/06/26(土) 15:55:490033デフォルトの名無しさん
2010/06/27(日) 16:28:420034デフォルトの名無しさん
2010/08/05(木) 23:46:40char www[100];
char* ptr;
ptr = www + i;
array<char>^ www = gcnew array<char>(100);
array<char>^ ptr;
ptr = www + i; ← ?
?の部分をご教授くださいm(_ _)m
0035デフォルトの名無しさん
2010/08/06(金) 00:53:220036デフォルトの名無しさん
2010/08/06(金) 10:21:400037デフォルトの名無しさん
2010/08/07(土) 08:14:59無理なので常にwwwとiをセットにして持ちまわるのが普通
メソッドの引数にもオフセットを指定できるようにする
0038デフォルトの名無しさん
2010/08/07(土) 22:43:160039デフォルトの名無しさん
2010/08/08(日) 12:07:55言語レベルでサポートされる可能性はある。
C++/CLIはほぼ見捨てられてるので期待するだけ無駄。
0040デフォルトの名無しさん
2010/08/17(火) 21:49:08array<char>^ www = gcnew array<char>(100);
interior_ptr<char> ptr;
ptr = &www[0] + i;
0041デフォルトの名無しさん
2010/08/21(土) 06:53:22RS-232Cで通信を行い、プログラムを終了させようとして
this->Close();
を行うと、エラーメッセージも出ないままプログラムが固まってしまいます。
ポートを閉じてないことが原因かと思い、
serialPort1->Close();
を実行してみたところ、今度はここで同じように固まってしまいました。
http://vsug.jp/tabid/63/forumid/46/postid/9991/scope/posts/Default.aspx
を、参考に、BeginInvokeを使用していますが、ダメでした。
この場合、どこを見れば良いのでしょうか?
よろしくお願いします。
0042デフォルトの名無しさん
2010/09/18(土) 16:16:15Bitmap、Image、Graphic・・・どのコンポーネントを使うのがお得なのでしょうか
0043デフォルトの名無しさん
2010/09/18(土) 16:36:42どんな画像処理をするかが分からないと、
えらべないと思われます
004442
2010/09/18(土) 16:48:33あと、今のところはCUIで行いたいです。
0045デフォルトの名無しさん
2010/09/18(土) 18:01:22俺はあまり詳しくないが、
ぐぐると
ttp://msdn.microsoft.com/ja-jp/academic/cc998604.aspx
ここで
Bitmap クラスを利用することにより、画像に対してピクセル単位で様々な処理を行うことができます
と書いてある
.netのクラスを使うなら、おそらくやりたいことはこういうことだろう
0046デフォルトの名無しさん
2010/09/18(土) 23:40:29WriteBitmap("C:\\・・・",data)とかdata.Save(・・・)ってな感じでできないのかな
0047デフォルトの名無しさん
2010/09/18(土) 23:43:330048デフォルトの名無しさん
2010/09/19(日) 05:14:500049デフォルトの名無しさん
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
0050デフォルトの名無しさん
2010/09/20(月) 07:25:44test.jpegはちゃんとプロジェクトファイルと同じ階層にある?
余計なお世話かも知れないが、.netでやるなら
C#で作ったほうが楽なんじゃないだろうか・・・
わざわざマイナーな環境で挑戦するよりもいいと思うんだが
0051デフォルトの名無しさん
2010/09/20(月) 08:08:59落ちてる場所は、その上の行だぞ。
0052デフォルトの名無しさん
2010/09/20(月) 11:32:08初心者が質問するたびに使うなと勧められる
0053デフォルトの名無しさん
2010/09/20(月) 13:44:55ありがとう。jpegじゃなくてjpgだったという凡ミスしていたことに気づけたわ
・・・一度C#に浮気してみる
0054デフォルトの名無しさん
2010/09/20(月) 13:53:46嫌われているというか、言語自体が初心者お断りだからな
初心者が無謀なことしようとしていたら、そりゃ止めるだろう
0055デフォルトの名無しさん
2010/09/20(月) 14:01:21使わなくていいなら使いたくない。
0056デフォルトの名無しさん
2010/09/20(月) 15:01:38MDI作るときどうするかとか
ちょっとしたことの逆引きがネット上で全く出てこない
ようやくOpenGL表示できるようになって
C++の頃の遺産をつかえると思ったのに
0057デフォルトの名無しさん
2010/09/20(月) 16:33:26なにもかもC++/CLIで済ませようとしないことをお勧めする
0058デフォルトの名無しさん
2010/09/21(火) 02:27:48ただ何故かこの言語とのファーストコンタクトというか接し方が
一言入れておかないと不幸にしかならなそうな人が多いのよね
0059デフォルトの名無しさん
2010/09/21(火) 09:55:56こういうのがあるから「Visual C++ 2008 で簡単GUIプログラミング」みたいな勘違い本やサイトが出て初心者が道を間違える
0060デフォルトの名無しさん
2010/09/21(火) 23:18:00C++の文法がある程度使えて
フォームデザインが総合開発環境上で扱えて
至れり尽くせりじゃん、と思ってとっかかりました
現実は情報が全く無く
よくわからないクラスとかいっぱいあって
解説も無くて
どうしようと途方にくれていましたが、QTとかよりは
導入コストも再勉強のコストも無いだろうと信じて使ってます。
だって、CやC++だとGUI作るの辛いんだもん
っていう理由だとダメですか
0061デフォルトの名無しさん
2010/09/21(火) 23:32:23マネージ部分はC++とは直接関係なくて学び直し必要だし
それなら素直にC#
C#2.0の範囲までなら多分C++/CLIより簡単だし
サンプルも多いし将来WPF/Silverlightとかにも応用できるし
C#やっとけば逆にC++/CLIを橋渡し用ぐらいなら書けるようになるし
0062デフォルトの名無しさん
2010/09/27(月) 13:44:310063デフォルトの名無しさん
2010/09/27(月) 14:03:20それを一応形にできたところは評価できる。
0064デフォルトの名無しさん
2010/09/27(月) 19:28:250065デフォルトの名無しさん
2010/09/27(月) 19:37:100066デフォルトの名無しさん
2010/09/28(火) 02:31:06//////////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();//コマンドラインから取得//ここでエラー
///////////ここまで/////////////
つまり二重起動時に共有メモリを使いたいのですが、どうしてもできません。
先人方どんなことでもいいので教えてくだせえ。
0067デフォルトの名無しさん
2010/09/28(火) 02:40:230068デフォルトの名無しさん
2010/09/28(火) 02:51:50> lpBuf=Environment::GetCommandLineArgs();//コマンドラインから取得//ここでエラー
コードの方はarray<String^>^からLPVOIDに変換したいように見える
0069デフォルトの名無しさん
2010/09/28(火) 03:19:272008 Express Editionを使っていまして・・・ヘッダーがないらしいです。
http://www.codeguru.com/forum/showthread.php?t=468408
>>68
コマンドライン引数を得た後、array<String^>^に変換しようと思ったのです。
宣言時からarray<String^>^だとMapViewOfFileでつまずいちゃうので・・・。
どちらにせよ、コマンドライン引数を得た後、
共有メモリarray<String^>^として反映できればいいのですが。
0070デフォルトの名無しさん
2010/09/28(火) 03:50:07そもそもLoadイベントなんかでやる処理には見えないけど(mainでやることだろ)
共有メモリにString^を書き込みたいのなら
> ttp://www.codeguru.com/forum/showthread.php?t=468408
のリンク先にString^をポインタに変換する方法が載ってるからmemcpyなりなんなりすればいい
複数の文字列を書き込む必要があるなら\0なりなんなりで区切る
0071デフォルトの名無しさん
2010/09/29(水) 06:10:09とにかく二重起動時にコマンドライン引数を渡すことができました!
皆様、貴重なアドバイスをありがとねん
0072デフォルトの名無しさん
2010/10/03(日) 12:39:42safe_cast :型が合わないと例外が発生、実行コスト中
dynamic_cast:型が合わないとNULLを返す、実行コスト大
static_cast :型が合わなくても何もしない、実行コスト小
この認識であってますか?
0073デフォルトの名無しさん
2010/10/03(日) 16:11:05static_castが速くなるのはダウンキャストの場合だけ。静的に解決できる場合はsafe_castと同じ。
0074デフォルトの名無しさん
2010/10/03(日) 20:39:28いまさらだけど、.NET Framework 4以降ならMemoryMappedFileクラスを使えばいいと思うよ。
0075デフォルトの名無しさん
2010/10/03(日) 20:52:42公式の説明でもパフォーマンスをえらく強調してるが、
そのためにわざわざ検証不能コードにしてまでやるほどのものなのかと
0076デフォルトの名無しさん
2010/10/08(金) 20:22:23>どうやらそれらは、レガシC++アプリケーションをWindows Phoneに移植したいと考えている多くの開発者にとって、C++/CLIは、ベストなルートに見えるのであろう。
地獄への道は善意で舗装されている
0077デフォルトの名無しさん
2010/10/08(金) 20:28:080078デフォルトの名無しさん
2010/10/08(金) 20:52:06Silverlightで使える範囲のC++/CLIはC++とは全く互換性なくてただの汚いC#なんだけど
0079デフォルトの名無しさん
2010/10/08(金) 21:47:310080デフォルトの名無しさん
2010/10/08(金) 22:05:210081デフォルトの名無しさん
2010/10/09(土) 21:36:15画像の場合ピクチャボックスみたいな感じに楽に音楽再生させたいのだけど
0082デフォルトの名無しさん
2010/10/10(日) 23:03:16.NET使ってもできる
どちらにしてもC++/CLIとは直接関係ない話
0083デフォルトの名無しさん
2010/10/11(月) 00:46:33これ絶対初心者向けじゃない気がする
0084デフォルトの名無しさん
2010/10/11(月) 00:49:57絶対初心者向けではない、その通りだ。
0085デフォルトの名無しさん
2010/10/11(月) 06:02:46俺みたいな勘違い君が集まるから
スレタイ変えると平和になる気がする
0086デフォルトの名無しさん
2010/10/11(月) 11:40:19「C++(非CLI)でアプリを作っているが、.NETのライブラリを使って音を鳴らしたい」
→そこだけC++/CLIを部分的に使おう
という風に特別な意図を持って言語であって、
>>81のような質問が出てくる時点でC++/CLIを使うのは間違っている
0087デフォルトの名無しさん
2010/10/11(月) 12:08:450088デフォルトの名無しさん
2010/10/11(月) 13:10:090089デフォルトの名無しさん
2010/10/11(月) 15:50:17C++/CLIの初心者向けのスレなんだよなw
0090デフォルトの名無しさん
2010/10/11(月) 16:27:401) C++習得レベル一定以上
2) .NET習得レベル一定以上
だからな
0091デフォルトの名無しさん
2010/10/12(火) 02:47:19みんな言うように初心者が使う物じゃないね。
0092デフォルトの名無しさん
2010/10/12(火) 15:18:47どうしても必要なときにちょっと調べてその場が凌げれば充分
0093デフォルトの名無しさん
2010/10/12(火) 18:55:470094デフォルトの名無しさん
2010/10/12(火) 19:17:34アンマネージとマネージの境界は常に意識する必要がある。
0095デフォルトの名無しさん
2010/10/12(火) 20:52:46Express Editionだと実行中のプロセスにアタッチできるのが
C++しかないってのも使ってる理由のひとつ。
0096デフォルトの名無しさん
2010/10/27(水) 21:11:21簡単GUIプログラミング!みたいな見事な勘違い記事だった。騙されて道を誤る初心者が不憫でならない。
0097デフォルトの名無しさん
2010/10/30(土) 18:38:530098デフォルトの名無しさん
2010/10/31(日) 02:19:240099デフォルトの名無しさん
2010/11/02(火) 23:54:010100デフォルトの名無しさん
2010/11/02(火) 23:59:30CLI拡張の部分だけでも言語仕様書の量がC#並み
0101デフォルトの名無しさん
2010/11/03(水) 00:03:310102デフォルトの名無しさん
2010/11/03(水) 04:25:150103デフォルトの名無しさん
2010/11/03(水) 16:45:49なんとなくこんな感じ、って思い描いたものが
1行で組みあがるくらいに
なるわけねぇ
0104デフォルトの名無しさん
2010/11/03(水) 17:28:32pin_ptr<SCRIPT_STRING_ANALYSIS*> pssa = &(this->構造体型の変数);
こういう風にしてもうまくいかないんだが
0105デフォルトの名無しさん
2010/11/03(水) 17:41:24自己解決した
単にpin_ptrの型を間違っていただけだった
0106デフォルトの名無しさん
2010/11/11(木) 20:14:40int 数値 = 0;
みたいに。
うっかり全角アルファベット混ぜたりしたら大変だな。
0107デフォルトの名無しさん
2010/11/11(木) 20:26:13コンパイラが共通なんだから
0108デフォルトの名無しさん
2010/11/11(木) 22:11:50今のパソコンて、ゼロに斜線が入らないから、うっかり
int 数値 = O;
とかしてしまうとやばいぜw
0109デフォルトの名無しさん
2010/11/12(金) 04:36:060110デフォルトの名無しさん
2010/11/12(金) 13:04:12Windows Mobile 6 Professional SDK Refresh.msiと
試しにVS2010EEを入れてみたけど
ダメでした
Windows Mobile 6 Professional SDK Refresh.msiは2環境でインストールして
いるのでインストーラがコケたとかでは無さそうです
定義だけなのでGoogle Codeとかでも良いのですが、MS系は上手く手に入りません。
くだすれですがよろしくお願いします。
0111デフォルトの名無しさん
2010/11/13(土) 12:22:30こう宣言すると
System.ArgumentException' の初回例外が発生しました。
とイミディエイトウィンドウにメッセージが出るんだけど
宣言の仕方どこが間違ってますか?
0112デフォルトの名無しさん
2010/11/13(土) 17:42:15#include <cliext/queue>
using namespace System;
cliext::queue<array<String^>^ > queue_dwnload;
0113デフォルトの名無しさん
2010/11/13(土) 18:21:47プログラムも正常に動作してます
それでもう少しシンプルなコードで試してみたんだけど
VS2008で新規作成、プロジェクト、CLRのwindowsフォームアプリケーション
のテンプレートでプロジェクトを作成して
#include <cliext/queue>を追加
~Form1(){}の下あたりに
cliext::queue<array<String^>^ > queue_dwnload;を追加
デバッグ実行する
これだけでメッセージが出ます、キューの宣言は間違ってないみたいだけど
何が原因なんだろう?
0114デフォルトの名無しさん
2010/11/13(土) 19:06:11~Form1()と同じprotectedには出来ないのかコンパイル時に警告がでる。
privateにしたらどう?
private: cliext::queue<array<String^>^ > queue_dwnload;
0115デフォルトの名無しさん
2010/11/13(土) 22:52:090116デフォルトの名無しさん
2010/11/14(日) 14:34:28まずコンパイルが警告なしで通るかどうか。
通るならデバッグ実行とデバッグなし実行で差があるかどうか。
別のPCでも再現するかどうか。
0117デフォルトの名無しさん
2010/12/02(木) 11:27:46プロジェクト: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でメンバ関数の実装をせずに放置というのは可能でしょうか?
0118デフォルトの名無しさん
2010/12/02(木) 18:43:310119デフォルトの名無しさん
2010/12/02(木) 19:44:11代入演算子やコピーコンストラクタはそもそもオーバーロードできないし
constも使えないし参照渡しや参照返しもダメ(そもそもref classだから無意味)
つかまずC#やるべき。.NETの常識が無さすぎ。
0120117
2010/12/02(木) 22:33:30そうなんですか、回答ありがとうござます。
>>119
回答ありがとうございます。
http://msdn.microsoft.com/ja-jp/library/sy1y3y1t(VS.80).aspx
このサンプルコードのコンパイルが通らなかったのですが、そもそもサンプルが間違ってるという事なのでしょうか?
あと、.NETの常識を学ぶのにオススメの書籍などあれば教えていただけると幸いです。
0121デフォルトの名無しさん
2010/12/03(金) 11:24:33間違ってると言うより、そこは問題とは関係ない部分なだけ
0122117
2010/12/03(金) 12:41:30回答ありがとうございます。
別途実装をするしか無いという事ですね。分かりました。
そうすると >>119 の回答から考えて、C#などから使わせるつもりが無いなら、
・演算子のオーバーロードはstaticにする必要はない
・代入演算子やコピーコンストラクタはオーバーロードできる
・constも使えて参照渡しや参照返しもOK
ということでしょうか?
0123デフォルトの名無しさん
2010/12/03(金) 15:36:41C#やVBと相互運用しないとしてもconstパラメータは事実上役に立たない。
0124デフォルトの名無しさん
2010/12/04(土) 13:39:31C++スタイルでやりたいだけなら、そもそもC++/CLI 使う必要性がないんでない?
0125117
2010/12/04(土) 14:33:18回答ありがとうございます。
Hoge % operator=( Hoge % arg ) { 代入処理の実装 } ;
これだと代入元が書き換えられそうで気持ち悪いですけど、そういう流儀なのですね。分かりました。
>>124
>>122 の質問に関しては元々あった疑問ではありません。
>>119 の解答に書かれている内容に関しての事実確認です。
趣旨に関してはスレ違いだと思いますので書きません。
0126デフォルトの名無しさん
2010/12/04(土) 14:48:36ref classだから常にポインタ渡し
0127デフォルトの名無しさん
2010/12/05(日) 13:03:24MSのサンプルだか自動生成されるコードだかで、
あんな風にrefクラス上でC++っぽいことをやっているものを見た覚えがある。
元の質問者のコードもそういうのに影響されたのではないかと思う。
0128デフォルトの名無しさん
2010/12/05(日) 14:36:18UInt32 data[5];
};
これがコンパイル通らないんだけど、
array<UInt32>^ data;とかにしていちいちgcnewするしかないんですか?
データ宣言するだけのためにコードなんて書きたくないので、うまい解決法お願いします。
0129デフォルトの名無しさん
2010/12/05(日) 15:20:340130デフォルトの名無しさん
2010/12/05(日) 21:27:52この手の機能でC#に負けてどうする
0131デフォルトの名無しさん
2010/12/05(日) 21:36:00atlstr.h、atlbase.h、atlapp.hは入れてるけどコンパイルとまる
0132デフォルトの名無しさん
2010/12/06(月) 21:09:33System::windows::form::timer で一秒ごとにlabel->textを更新していますが(要は時計です)
最小化から復帰するとlabel->textが更新されなくなります、何故でしょう。
0133デフォルトの名無しさん
2010/12/07(火) 22:12:400134デフォルトの名無しさん
2010/12/08(水) 00:35:19MSDNにもはっきりそう書いてあるだろ
0135デフォルトの名無しさん
2010/12/08(水) 00:44:46故意に止めるようなことはしていないんですが、そういう仕様なんでしょうか?
0136デフォルトの名無しさん
2010/12/08(水) 00:46:00えぇぇぇぇぇ。時間分解能が悪いとかあの辺ですか!ヽ(´Д`;)ノアゥ...
スレッドタイマークラスとかに変えます。ご教授ありがとうございます。
0137デフォルトの名無しさん
2010/12/08(水) 00:57:53どこだったか忘れたけど
0138デフォルトの名無しさん
2010/12/08(水) 11:59:01俺も最初使ってみて混乱した
0139デフォルトの名無しさん
2010/12/08(水) 14:19:360140デフォルトの名無しさん
2010/12/09(木) 00:12:13C++/CLIでラップしたネイティブのライブラリから例外が発生して、
C++/CLI側でcatchした時に、
ネイティブ側のインスタンスのデストラクタが呼ばれません。
これはバグと考えて良いのでしょうか?
VC++2010 expressでは普通に呼ばれたので・・
0141デフォルトの名無しさん
2010/12/09(木) 03:14:40あれからいろいろいじりまくっていたんだけど、どうもフォームの透過色(TransparencyKey)が特定の色の場合
この問題が発生しているようです。引き続き調べてみます。
0142140
2010/12/10(金) 18:48:44解決したので適当に報告しときます。
とりあえず、ネイティブのライブラリオプションを
/EHscから/EHaに変更することで、デストラクタが呼ばれるようになりました。
どうやらオプションの違いでABIに互換性が無くなり、
例外をハンドルできても、その後のアンワインディングを正常に実行できていなかったようです。
デフォルトのオプション設定だと上記のような状態になるので、
自分みたいに知らずに組んでる人はメモリリークし放題ですね。
0143デフォルトの名無しさん
2011/01/11(火) 22:48:33event Action^ Foo;
とやると
エラー1error C2955: 'System::Action' : クラス ジェネリック を使用するには ジェネリック 引数リストが必要です
って出てくる…
0144デフォルトの名無しさん
2011/01/11(火) 22:54:330145デフォルトの名無しさん
2011/01/11(火) 22:57:47ありがとう…
おまえそんなところにいたのか…
0146デフォルトの名無しさん
2011/02/05(土) 21:22:18それともインテリセンス使うために2008書いてる?
それともC++/CLI書かない?
0147デフォルトの名無しさん
2011/02/05(土) 21:30:17書かざるを得なくなるかもしれなくてちょっと憂鬱
0148デフォルトの名無しさん
2011/02/05(土) 22:28:460149デフォルトの名無しさん
2011/02/05(土) 22:49:37C++自体が言語として糞だから仕方がない。
それと互換性保ちながらここまで実現したということを考えると、かなりすごいと思う。
0150デフォルトの名無しさん
2011/02/05(土) 22:50:520151デフォルトの名無しさん
2011/02/05(土) 22:54:50え。それは、今では使うのは好ましくないとされているレガシー関数群をいまだにお使いになられているからではないですか?
0152デフォルトの名無しさん
2011/02/06(日) 11:47:30CLIの部分については互換性ゼロなんだから
0153デフォルトの名無しさん
2011/02/06(日) 11:51:41> CとC++に互換性があるとは言わないだろ
それは上位互換ありでしょ。完全ではないけれども。
0154デフォルトの名無しさん
2011/02/06(日) 12:50:45斜め上をいく馬鹿だったか
0155デフォルトの名無しさん
2011/02/08(火) 22:27:38ストリップメニューを開くと5個ぐらい項があって
3つチェックされているとして、その3という数字を取りたいのですが
どうすれば良いでしょうか?
開く部分の変数はStripMenuItem1です。
for(int = 0;i<StripMenuItem1->項目数;i++){if(StripMenuItem1->子項目->checked == true){temp++;}}
みたいなのはありますでしょうか?どうすれば良いでしょうか?よろしくおねがいします
0156デフォルトの名無しさん
2011/02/08(火) 22:55:330157デフォルトの名無しさん
2011/02/08(火) 23:02:04StripMenuItem1.Itemsプロパティで子が全て取得できる
言っちゃ悪いけどそういう意味での初心者がC++/CLIなんか使うもんじゃない
先にC#覚えて
0158デフォルトの名無しさん
2011/02/08(火) 23:03:11レスありがとうございます
申し訳ありません。理解できません
何か関数があるのでしょうか?
自前で数えるといっても、2個チェックのときは2と自動で取ってこれるようにしたいのです。
そういえば
if(項の変数->checked == true){temp++;}
を何行も書けばいいだけですね。ありがとうございました!
0159デフォルトの名無しさん
2011/02/08(火) 23:03:52ありがとうございました!
0160デフォルトの名無しさん
2011/02/08(火) 23:11:25>>21や>>42はまだC++/CLI使ってるんだろうか
0161デフォルトの名無しさん
2011/02/09(水) 00:53:00> - C++プログラミング
> - .NETプログラミング (C#, VB.NET, etc.)
>
> に不自由する方はお引き取りください
とか若干きつめに書いておけばいいじゃね?
何年先になるかは分からんけどw
4,5年ぐらい?ww
0162デフォルトの名無しさん
2011/02/09(水) 06:13:09cli::array<Type,dimension> ^' から 'WCHAR []' に変換できません。
->ToCharArray();でWCHARが帰ると思っていたのですがなぜでしょうか?どうすれば良いですか?
0163デフォルトの名無しさん
2011/02/09(水) 06:31:170164デフォルトの名無しさん
2011/02/09(水) 06:33:29wcscpyしたいです。
というか元々wcscpyの引数に入れるつもりでしたができませんでした。
0165デフォルトの名無しさん
2011/02/09(水) 07:06:40ちなみに、第二引数にその->TEXTの文を入れて
別に用意した第一引数のWCHAR[3][]とかに入れたいのです
0166デフォルトの名無しさん
2011/02/09(水) 07:48:58もともとは初心者お断りスレもあったが、話題があまりなくて落ちた
>dat落ち姉妹スレ
>C++/CLI part3
0167デフォルトの名無しさん
2011/02/09(水) 09:38:590168デフォルトの名無しさん
2011/02/09(水) 11:16:29文字列操作はこれがひっかかったぞ
ttp://vene.wankuma.com/prog/CppCli_strings.aspx
0169デフォルトの名無しさん
2011/02/09(水) 11:18:17サンクス
おせーよ
0170デフォルトの名無しさん
2011/02/09(水) 15:36:360171デフォルトの名無しさん
2011/02/12(土) 16:44:50VCのExpress Editionが入門者向けというより達人の縛りプレイ用になってるじゃないか
0172デフォルトの名無しさん
2011/02/12(土) 17:53:400173デフォルトの名無しさん
2011/02/12(土) 18:35:170174デフォルトの名無しさん
2011/02/13(日) 04:23:39金払え
0175デフォルトの名無しさん
2011/02/18(金) 09:47:29どうやって値の受け渡しをすればいいの?
親にpublic関数を用意して呼び出すのが簡単なわけだけど
この.hファイルに親の.hファイルをインクルードすると子のデザイナが壊れる
子ダイアログで親の形を認識させる手段がない
0176デフォルトの名無しさん
2011/02/18(金) 10:00:220177デフォルトの名無しさん
2011/02/18(金) 16:30:00ソートするにはどうしたら良いでしょうか?
こんな感じじゃないかと思うのですが
「関数呼び出しには引数リストがありません。
メンバへのポインタを作成するために '&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);
0178デフォルトの名無しさん
2011/02/18(金) 17:09:320179デフォルトの名無しさん
2011/02/18(金) 17:41:53Form1クラスの上で定義したらできました
いまいちよくわからないですが
これからじっくり理由を考えて見たいと思います、感謝
0180デフォルトの名無しさん
2011/02/20(日) 21:49:54.49VC++2010 Expressでフォームからマウスが外れているときはフォームの透明度を
あげる(薄くする)と言うプログラムを組んでいます。フォームのMouseLeaveイベントと、
MouseEnterイベント発生時にOpacityプロパティを変えることで実現を目論んだのです
が、ウインドウの外枠(サイズを変えるときにドラッグする部分や、上部のウインドウ名
が書かれている部分)にマウスがあると、MouseLeaveイベントが発生して、薄くなって
しまいます。もちろん、ここではたとえ、フォーム外側から移動してきてもMouseEnter
イベントは起きません。
フォームから完全にマウスカーソルがそれた時のみ透明度を高めたいのですが、
どういうイベントを用いればよいんでしょうか?
0181デフォルトの名無しさん
2011/02/21(月) 01:14:11.850182180
2011/02/21(月) 07:06:34.790183180
2011/02/21(月) 07:08:31.22すみません。
0184デフォルトの名無しさん
2011/02/21(月) 07:51:25.560185デフォルトの名無しさん
2011/02/26(土) 23:54:49.36template <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)というパラメーターの関数を定義したんだが、こいつへの渡し方がわからない
誰か教えてくれまいか
0186デフォルトの名無しさん
2011/02/27(日) 02:13:39.66読み取り専用で試したが結果は同じ
CLIとしてコンパイルしたWindowsアプリからOpenProcessを呼び出すとフル権限で開ける
C++としてコンパイルしたコンソールアプリからはOpenProcess読み取り専用でもアクセス拒否される
OSはWindows7 64bit
内部のことは分からないですが、OpenProcessは同じ標準process.h内のものを使ってると思う
少なくともソース上ではそういう記述をしてますがコンパイラが何をしてるかまでは定かじゃないです
大きな違いはコンソールアプリであることですが、それが拒否の原因になるんでしょうか?
0187デフォルトの名無しさん
2011/02/27(日) 18:39:56.37テキストボックスに文字が入力され、エンターを押されたら動作する処理を行いたいのですが、
TextChangedイベントに
if(TextBox1->Text->EndsWith("\r\n"))
では、認識出来ないのですが、どのようにすればよろしいのでしょうか?
よろしくお願いします。
0188デフォルトの名無しさん
2011/02/27(日) 19:14:15.810189デフォルトの名無しさん
2011/02/27(日) 19:44:49.910190デフォルトの名無しさん
2011/02/27(日) 19:48:31.210191デフォルトの名無しさん
2011/02/28(月) 15:45:27.41com::ptr で保持して、リリース処理はそっちで対応しちゃあかんの?
0193デフォルトの名無しさん
2011/02/28(月) 19:01:42.54すまん。
CComPtrと勘違いしてた
com:ptrはCLRでも使えるのか
0194デフォルトの名無しさん
2011/02/28(月) 19:28:37.85それ用のクラスだぜ
あとは .net Framework の System::Runtime::InteropServices::SafeHandle を実装したら?
0195デフォルトの名無しさん
2011/02/28(月) 20:58:29.72最近のは知らんけど
0196デフォルトの名無しさん
2011/02/28(月) 23:42:18.77KeyPress
0197デフォルトの名無しさん
2011/03/01(火) 00:17:52.54詳しく
0198デフォルトの名無しさん
2011/03/01(火) 01:40:02.26ファイナライザスレッドでどーのこーのみたいな話だったか
使えないというか使う意味がない、みたいな
0199デフォルトの名無しさん
2011/03/10(木) 18:48:24.24なんでprintfがアンマネージのコードって
コンパイラは理解できるの?
それらしい印になるようなキーワードを
特に書いてないような気がするのだが?
0200デフォルトの名無しさん
2011/03/10(木) 18:56:54.84#include か #using かで切り分けてるんだと思うけど
0201デフォルトの名無しさん
2011/03/15(火) 00:19:49.85Form1からForm2を開き、Form2を表示した状態でForm1のテキストボックスにフォーカスを合わせたいのですが、何か良い方法はありますでしょうか?
Form2のShownイベントで、Form1->TextBox1->Forcus();を実行してみましたが、Form1が見つかりませんでした。
よろしくお願いします。
0202デフォルトの名無しさん
2011/03/15(火) 14:20:33.94見つかる様にするんだよ。
作成時にインスタンス渡すとか、間を取り持つ作るとか
0203201
2011/03/23(水) 22:44:49.12ここを参考に、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を使用してます。
よろしくお願いします。
0204デフォルトの名無しさん
2011/03/24(木) 02:14:35.75とりあえずヒントだけ出したけど、C++、.NET、プログラミングの基礎にあたる内容はスレチだから返答は不要
というか、C++/CLIはコンパイル可能なコードすら書けないようなプログラミング初心者が使うものじゃない
0205デフォルトの名無しさん
2011/03/24(木) 04:38:21.64MSDNには3.5を利用するには2008SP1を入れろとかありましたが
NETのバージョンごとに入れるのはさすがに無駄すぎるので。
0206デフォルトの名無しさん
2011/03/24(木) 11:57:27.41プロジェクトファイルをテキストエディタで編集しろということらしい
C++/CLIで作った混合アセンブリはCLR2(.NET2.0-3.5)向けにコンパイルすると
CLR4では動作しなくなるので注意
インテリセンスも削られてるのでC++/CLIなら2008で作業するほうがいいよ
0207デフォルトの名無しさん
2011/03/24(木) 20:41:15.80http://msdn.microsoft.com/ja-jp/library/47w1hdab.aspx
こちらのページを読んだところ
2010は4.0だけ、2008SP1なら3.5だけなのかと思ってしまったのですが
2008SP1は2.0〜3.5まで扱えるんですね
2008を入れることにします
ありがとうございました
0208デフォルトの名無しさん
2011/04/01(金) 22:50:53.88画面を表示させ、ボタンを押したら表示されている画面をbitmapイメージとして保存(出来れば印刷も)したいのですが、
そういう事は可能なのでしょうか?
サンプルソース等探してみたのですが見つからなくて行き詰ってしまいました。
0209デフォルトの名無しさん
2011/04/01(金) 22:54:32.68C#だぞ。C++/CLIじゃないぞ。
0210デフォルトの名無しさん
2011/04/01(金) 22:57:17.22なるほど、C#で調べれば良かったんですね。。
自身に[Alt]+[Print Screen]を送れば良かったんですね
ありがとうございます
0211デフォルトの名無しさん
2011/04/02(土) 12:02:12.18どういうソース書けばいいんでしょうか?
0212デフォルトの名無しさん
2011/04/02(土) 12:06:00.79C#だぞ。C++/CLIじゃないぞ。
0213デフォルトの名無しさん
2011/04/02(土) 12:31:38.060214デフォルトの名無しさん
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)を継承したクラスを定義し、
コマンドラインをメンバ変数として持たせるというのも考えましたがどうも無理やり過ぎる気がします。
何かよい方法はないでしょうか。
0215デフォルトの名無しさん
2011/04/02(土) 17:39:23.59System.Collections.GenericのDictionary<,>使え
というか>>208以降の人はC++/CLIやる前にまずC#やったほうがいい
0216デフォルトの名無しさん
2011/04/02(土) 17:45:48.60お早い回答ありがとうございます。
> System.Collections.GenericのDictionary<,>使え
どのようなものか、調べてみます。
> というか>>208以降の人はC++/CLIやる前にまずC#やったほうがいい
C++を既に学習しており、基本C++の文法でいける(と私が思う)C++/CLIのほうが新たにC#を学ぶより
よさそうだと考えておりましたが、
今後考えてC#を学ぶことも考えたいと思います。ありがとうございました。
0217デフォルトの名無しさん
2011/04/02(土) 17:58:52.750218デフォルトの名無しさん
2011/04/02(土) 18:01:20.52C++/CLIはC++とC#を理解して
その上でもしも両方同時に必要になったときに橋渡しするために嫌々ちょっとだけ使う言語です
0219デフォルトの名無しさん
2011/04/02(土) 18:38:49.60そんな手もあるのですね。
結局>>214で述べた
> リンクの型(System::Windows::Forms::LinkLabel)を継承したクラスを定義し、
> コマンドラインをメンバ変数として持たせると(略
これで作ってしまいました。今回はこれでいいとして、今後はC#を学んでみたいと思います。
ありがとうございました。
0220デフォルトの名無しさん
2011/04/03(日) 17:02:31.86手元にあるvs2010では問題なく動いた
0221デフォルトの名無しさん
2011/04/03(日) 18:14:41.51IDEが自動でインデントをぐちゃぐちゃに破壊してくれるので
C++をラップするくらいにしか使わない
0222デフォルトの名無しさん
2011/04/03(日) 19:08:09.39>>219のようなかわいそうな人を生むだけで害悪しかない
0223デフォルトの名無しさん
2011/04/03(日) 21:53:39.15別に「統合」してくれと頼んだわけでもないのに
へんな統合開発環境の下で働かされてる
0224デフォルトの名無しさん
2011/04/10(日) 21:32:31.72どのようにメモリを解放するのですか?
0225デフォルトの名無しさん
2011/04/10(日) 21:42:17.880226デフォルトの名無しさん
2011/04/10(日) 21:49:49.30ttp://www.atmarkit.co.jp/fdotnet/dotnettips/021gc/gc.html
0227デフォルトの名無しさん
2011/04/22(金) 05:33:09.44含まれてないかチェックする方法って知ってますか?
なぜこういうことを聞くかというとこのクラスライブラリをマネージコードから
使う必要が出てきたためです。
0228デフォルトの名無しさん
2011/04/22(金) 10:25:23.730229デフォルトの名無しさん
2011/04/22(金) 11:04:57.590230デフォルトの名無しさん
2011/04/22(金) 11:11:26.93混在アセンブリはマネージコードから使えるけど
セキュリティとか移植性とかでマネージコードしか使えないケースなんだとしたら
まず間違いなく/clr:pureではダメで/clr:safeでないといけない
でも/clr:safeなんて世の中にあるC++/CLIのコードのほとんどがコンパイルできないよw
0231227
2011/04/23(土) 09:53:36.44レスありがとう
> 混在アセンブリはマネージコードから使えるけど
> セキュリティとか移植性とかでマネージコードしか使えないケースなんだとしたら
> まず間違いなく/clr:pureではダメで/clr:safeでないといけない
説明不足でした
とにかくC++/CLIのコードのすべてのパブリックなクラスとメンバに
マネージコードからアクセスできるようにしたいんです
アンマネージコードが含まれてるとそれができないんじゃないかと思って質問しました
0232デフォルトの名無しさん
2011/04/23(土) 11:45:11.72というかそのためのC++/CLI
0233デフォルトの名無しさん
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は呼び出せない。
}
}
0234デフォルトの名無しさん
2011/04/23(土) 12:31:41.380235デフォルトの名無しさん
2011/04/23(土) 14:15:04.04C++/CLIみたら混在しているものと見なせばいいよ
0236227
2011/04/23(土) 18:24:35.15レスありがとう
アンマネージが含まれてもマネージから呼び出せるということだけど
C++/CLIのソースコードで画像処理とかやってて、
例えばビットマップの構造体をnewして先頭からのバイト数でアクセスするとか、
その情報を渡してWin32APIを呼ぶとかしまくってるんだけど、
これってアンマネージにコンパイルされるよね。
こんなメソッドをC#から呼んでまともに動作するんだろうかって心配なんです。
0237デフォルトの名無しさん
2011/04/23(土) 19:13:47.90その程度ならManagedでコンパイルされてるよ。ただしunsafeだけどね。
0238227
2011/04/24(日) 11:33:12.50マネージだけど暗黙的にunsafeとしてコンパイルされるから
アンマネージのように構造体やポインタが使えるってことか。
納得した。ありがとう。
0239デフォルトの名無しさん
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の方がよいと誰かに教わったのですが、理由を忘れてしまいました。
何故でしたでしょうか・・?
ご教示いただけますと幸いです。
0240デフォルトの名無しさん
2011/04/24(日) 19:23:40.940241239
2011/04/24(日) 19:27:37.310242デフォルトの名無しさん
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);
}
拡張メソッドは使えなかったっけ?ちとスマートじゃないな。
0243デフォルトの名無しさん
2011/04/24(日) 20:55:50.28というエラーがでた場合、どういう変換処理をかいたらいいんでしょうか??
0244デフォルトの名無しさん
2011/04/24(日) 21:08:28.840245デフォルトの名無しさん
2011/04/24(日) 22:09:06.50msclr::interop::marshal_as
0246デフォルトの名無しさん
2011/04/24(日) 22:36:22.37ありがとうございました。その逆の変換はどうするんでしょうか?
0247デフォルトの名無しさん
2011/04/24(日) 23:47:43.19今時サロゲートペアすら考えないコーディングは絶滅すべき
0248デフォルトの名無しさん
2011/04/25(月) 04:59:47.67http://msdn.microsoft.com/ja-jp/library/ms235631.aspx
0249デフォルトの名無しさん
2011/04/27(水) 16:00:21.03サロゲートペア対応に挑戦しようと思うのだが、VS2010expressのコンパイラでエラーになる。
なんかスマートな対応方法ないすか?
literal String^ str = L"「叱る」と「\uD842\uDF9Fる」";
error C3850: '\uD842': ユニバーサル文字名が無効な文字を指定しています。
error C3850: '\uDF9F': ユニバーサル文字名が無効な文字を指定しています。
0250デフォルトの名無しさん
2011/04/27(水) 21:36:58.89ググると𠮟るのユニコードは「20B9F」となってるけど。
0251デフォルトの名無しさん
2011/04/27(水) 21:40:24.110252デフォルトの名無しさん
2011/04/27(水) 22:11:33.08C#だぞ。C++/CLIじゃないぞ。
0253デフォルトの名無しさん
2011/04/27(水) 23:46:28.19\uxxxxじゃなくて\UxxxxxxxxでUTF-32使って指定するとか?
0254249
2011/04/29(金) 10:49:09.60CLRは内部コードが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
0255デフォルトの名無しさん
2011/04/29(金) 11:04:15.35StringInfo.GetTextElementEnumerator(s)
.Cast<string>()
.Reverse()
.ToArray()
)
でええやん(めんどくさいからC#)
0256デフォルトの名無しさん
2011/04/29(金) 12:57:21.310257デフォルトの名無しさん
2011/04/29(金) 13:17:08.71IEnumertorだから直接Linqにつなげない。
0258デフォルトの名無しさん
2011/04/30(土) 13:14:38.200259デフォルトの名無しさん
2011/04/30(土) 13:32:03.610260デフォルトの名無しさん
2011/05/14(土) 13:44:13.14少し触ってみたところ、GUIも作り易い感じがするしCライブラリも簡単に使えそうだし、
いったいどういう問題があるのかなと気になりました
(VC++2008EEなのでintellisenseもとりあえず大丈夫です)
0261デフォルトの名無しさん
2011/05/14(土) 21:00:19.76それだけ
0262デフォルトの名無しさん
2011/05/14(土) 21:23:06.33できればもうちょっと具体的にお願いします
0263デフォルトの名無しさん
2011/05/14(土) 21:55:07.50C++/CLI独特の文法を覚える必要がある。C#との互換性もない。
・使う人が少ないので情報が少ない
・Intelisenceの不具合が多い(例え2010でも逃れられない)
・中途半端にネイティブなのでCLRとしての最適化も中途半端。
0264デフォルトの名無しさん
2011/05/14(土) 22:05:31.030265260
2011/05/15(日) 19:08:05.61Visual C#を試しに入れてみたところ、
何だこれは…ひょっとしてC++/CLIだけでなくVisual C++自体が手抜き…?と思ってしまいました
これだとたしかに生産性に差が出るかもと思うと同時にMSの露骨な贔屓に少し閉口してしまいました
まだほんの入口ですしCライブラリについて不安はありますが、とりあえず使ってみようと思います
0266デフォルトの名無しさん
2011/05/15(日) 23:25:23.90言語そのものがインテリセンスやRADに向いてない
C++にはC++にしかできないことをやらせるとMSは言ってるので
フォームデザイナを使うような用途へのサポートが強化されるようなことは今後も期待できない
C++はネイティブ特化、C++/CLIは橋渡し専用
0267デフォルトの名無しさん
2011/05/16(月) 00:10:28.27この分だともうずっと出ないだろうな
0268デフォルトの名無しさん
2011/05/16(月) 09:33:24.320269デフォルトの名無しさん
2011/05/16(月) 10:32:51.80問題は「次」というのがSP2なのかVS2014とかになるのかが分からないこと。
0270デフォルトの名無しさん
2011/05/16(月) 10:37:08.05今やMSにとってはATLでCOM触るラッパーを書くためだけの言語だからなあ
0271デフォルトの名無しさん
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の有無にかかわらずここで実行できるじゃないか。");
0272デフォルトの名無しさん
2011/05/24(火) 21:38:05.21C++なら自分で再throwする必要があるが、
finallyを使えばそういうことを考える必要がない。
ついでに言うと、finallyブロックは
例外が起きようとも起きなかろうとも、
breakやreturnで抜けても必ず実行されるので
ファイルの閉じ忘れなどを回避する実に有効な手段である。
0273デフォルトの名無しさん
2011/05/24(火) 23:17:43.720274デフォルトの名無しさん
2011/05/25(水) 23:31:46.12だいたいそれで間に合うとは思う。
auto_handleやauto_gcrootの助けもあるしな。
まあ、今までのVisual C++にも__finallyあるし、C#にもfinallyあるし、
あえてC++/CLIに__finallyを搭載しない理由もないと言ったところでは?
0275デフォルトの名無しさん
2011/05/26(木) 01:03:44.37その場限りのちょっとした後処理のためにもいちいちクラス作るの?
0276デフォルトの名無しさん
2011/05/26(木) 05:07:03.51教えてほしいのですが、
hoge(int *piyo)は
hoge(int^ piyo)と
してるのですが
hoge(int **piyo)は
どのように書き換えれば良いのでしょうか
すいませんが教えてください
0277デフォルトの名無しさん
2011/05/26(木) 12:12:03.850278デフォルトの名無しさん
2011/05/26(木) 20:22:59.15using 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;
}
0279デフォルトの名無しさん
2011/05/26(木) 20:26:26.71System::Collections::Hashtable ^^ppHashtable1;
って何とかならんかいな。多重ループで毎回dynamic_cast演算子使ってる
と効率悪いだろうし。
0280デフォルトの名無しさん
2011/05/26(木) 20:45:23.45それと、ppHashtable1 = gcnew Hashtable ^[nmax];
の行も 「// コンパイルエラー」を忘れ取った。
0281デフォルトの名無しさん
2011/05/27(金) 01:02:41.420282デフォルトの名無しさん
2011/05/27(金) 03:30:26.71cli::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;
0283デフォルトの名無しさん
2011/05/27(金) 03:33:53.23pHashtable1 = dynamic_cast<Hashtable ^>(pArrayList1[n1]);
の行は間違いで正しくは
pHashtable1 = dynamic_cast<Hashtable ^>(pIEnumerator1->Current);
だった。
0284デフォルトの名無しさん
2011/05/27(金) 04:48:38.33using 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できないからアンマネージは使えない。
0285276
2011/05/27(金) 05:15:05.02>>277さんレスありがとうございました。
実はDirectXのBaseClassesをCLIで書いてるのですが
GetSyncSource( [Out]IReferenceClock** pClock) ;
(IReferenceClockはmanagedインターフェイスです)
の部分をどう書けば良いかわからないです。
interior_ptrというのを使えと出てきますが、使い方がよくわかりません。
どう書けば良いか、どなたかご教示ください。
0286デフォルトの名無しさん
2011/05/27(金) 05:52:09.46typedef System::Collections::Hashtable ^pHashtable;
pHashtable pHashtable_hairetu[8];
マネージなクラスというのはどうしようもないな、困ったもんだ。
0287デフォルトの名無しさん
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ってぼろいな。
0288デフォルトの名無しさん
2011/05/27(金) 23:37:00.98C++/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();
}
0289デフォルトの名無しさん
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();
}
0290276
2011/05/28(土) 08:14:55.34C++で
class Foo{
--色々なメソッドやメンバ--
}
である別のクラスのメソッドで
void Piyo(Foo **hoge);というのがあり
渡す値がFoo* fooとして
Piyo(&foo);とするとします。
これをCLIで実現するにはどのようにすればよいでしょうか
どなたかご教示ください。
0291デフォルトの名無しさん
2011/05/29(日) 00:06:15.74using 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);
}
0292デフォルトの名無しさん
2011/05/30(月) 12:26:48.80どうしても参照渡しでやりたいなら
void Piyo([System::Runtime::InteropServices::OutAttribute]Foo^ %hoge)
こう書くのが.NET的には正解
クラスライブラリ作ってるんでなければ好きにすればいいけど
0293276
2011/06/01(水) 06:53:05.38たいへん参考になりました。
0294デフォルトの名無しさん
2011/06/01(水) 07:08:44.99C,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;
};
と宣言したとして、?の部分には何の数値を入れればよいのでしょうか。
ヘルプを見ると「フィールドの物理的な位置を示します。」
と書かれているのですが、馬鹿なんでわかりません。
どなたか教えてください。
0295デフォルトの名無しさん
2011/06/01(水) 21:57:49.200296デフォルトの名無しさん
2011/06/03(金) 21:20:40.48全部0
>>>295
テンプレートはただの言葉遊び
ジェネリックは実行時に展開される
DLLを作る場合、アセンブリのパブリックメンバにテンプレートを使ってはいけない
0297デフォルトの名無しさん
2011/06/04(土) 14:38:11.46struct 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#から読み込む>これなら当然できる
ラップするとはどういうことなんでしょうか
0298デフォルトの名無しさん
2011/06/04(土) 15:04:33.100299デフォルトの名無しさん
2011/06/04(土) 15:58:05.320300デフォルトの名無しさん
2011/06/04(土) 17:21:15.05通常の C++ のポインタとか持ってちゃ、混合型になるだろ
0301デフォルトの名無しさん
2011/06/04(土) 17:47:19.16> structから一つ一つ値を完全にC++/CLIで作った構造体に抜き出し、その構造体をC#から読み込む
もちろんこれ
単純に書くだけなら直接C#でも大して手間の差はない
0302デフォルトの名無しさん
2011/06/04(土) 18:50:06.15何かものすごい事を期待していました・・・
0303デフォルトの名無しさん
2011/06/04(土) 19:05:39.17どうやるんですか?
0304デフォルトの名無しさん
2011/06/04(土) 19:19:52.390305デフォルトの名無しさん
2011/06/04(土) 20:30:56.92意味が全く分かりませんがPInvokeを調べてみます
0306デフォルトの名無しさん
2011/06/04(土) 20:31:25.240308294
2011/06/07(火) 07:00:08.28struct 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;
}
の部分はどのように書けば良いのでしょうか、すいませんが教えてください。
0309デフォルトの名無しさん
2011/06/07(火) 13:08:48.20しかもよりによってなぜ今時DirectDrawなのか。
[StructLayout(LayoutKind::Sequential)]struct MultiSampleCaps { ここは同じでオフセットも不要 }
/*Hogeの中*/[FieldOffset(4)]MultiSampleCaps MultiSampleCaps;
.NET関連で調べ物するときのキーワードはC++/CLIじゃなくてC#ね。
情報量1000倍だから。アホらしいと思ったらC#へどうぞ。
0310デフォルトの名無しさん
2011/06/08(水) 20:55:56.86プロセス間通信したいのですがどうすればいいですか。
0311デフォルトの名無しさん
2011/06/08(水) 22:03:55.290312デフォルトの名無しさん
2011/06/08(水) 22:35:11.370313デフォルトの名無しさん
2011/06/22(水) 01:29:30.29g->DarwLineだと2ドット最小?
0314デフォルトの名無しさん
2011/06/22(水) 06:08:56.940315デフォルトの名無しさん
2011/06/22(水) 11:33:33.87できた!
これからc++/cliするのとc#するのどっちがいいですか?
GPGPU & direct Xやるとしたらc++の方向のほうがいい?
0316デフォルトの名無しさん
2011/06/22(水) 11:48:19.120317デフォルトの名無しさん
2011/06/22(水) 12:42:08.360318デフォルトの名無しさん
2011/06/22(水) 13:44:22.22C#だとラッパー使うことになるし
まぁ、C++/CLIだけは無いけど
0319デフォルトの名無しさん
2011/06/23(木) 10:09:33.250320デフォルトの名無しさん
2011/06/23(木) 10:20:17.400321デフォルトの名無しさん
2011/06/23(木) 10:50:11.25自動的にC++/CLIになるからなー
MSは鬼や
0322デフォルトの名無しさん
2011/06/24(金) 00:13:45.930323デフォルトの名無しさん
2011/06/24(金) 00:20:14.620324デフォルトの名無しさん
2011/06/24(金) 06:58:51.760325デフォルトの名無しさん
2011/06/24(金) 14:45:59.69C++/CLIを使えば良いんじゃね?
0326デフォルトの名無しさん
2011/06/24(金) 14:52:10.850327325
2011/06/24(金) 15:04:02.96MSは頑張って理想通り完成させてくれよう
むしろ諦めたっぽいがw
0328デフォルトの名無しさん
2011/06/24(金) 23:04:13.78.net fw を使うための言語だと思うんだが
0329デフォルトの名無しさん
2011/06/26(日) 11:43:42.77C++/CLIというならいいけど、両者の利点を
生かすためにいきなりこれ、というのは無理w
0330デフォルトの名無しさん
2011/06/27(月) 09:26:00.43起動速度や応答性を気にしないなら、C#で十分ってことだな
0331デフォルトの名無しさん
2011/06/27(月) 10:22:03.55ネイティブのDLLを読み込む分遅くなることはあっても速くなることはない
それからアンマネージコードとマネージコードの境界を越えるオーバーヘッドは馬鹿にならないので
下手するとマネージコードだけの方が速い
0332デフォルトの名無しさん
2011/06/27(月) 10:36:48.76本当にラッパー専用言語だな
0333デフォルトの名無しさん
2011/06/27(月) 12:13:07.27D言語も悪いところも見えてくる。
0334デフォルトの名無しさん
2011/06/27(月) 15:06:24.730335デフォルトの名無しさん
2011/06/27(月) 17:47:56.62どうやってラップするの?
0336デフォルトの名無しさん
2011/06/27(月) 18:01:37.460337デフォルトの名無しさん
2011/06/27(月) 18:03:44.31なんでもかんでもDLLに包んでP/Invokeでおk
ObjCコンパイラ以上の荒業でラッパーコードが書けるのがC++/CLIの醍醐味だけど
なんか、こう、便利とは違うんだよなあ…
0338デフォルトの名無しさん
2011/06/27(月) 18:05:53.910339デフォルトの名無しさん
2011/06/27(月) 19:58:57.49C#のunsafeの方が簡潔にCっぽく書けて扱いやすい気がするんだが
0340デフォルトの名無しさん
2011/06/28(火) 09:14:21.36C++のUIだけC++/CLIやC#みたいに自動で作ってくれるC++は無い物か
BCBなら出来るけどさ
0341デフォルトの名無しさん
2011/06/28(火) 21:35:58.120342デフォルトの名無しさん
2011/06/29(水) 14:14:27.30C++/CLIは無かったことにして、買収しちゃえばそれで済むのに
0343デフォルトの名無しさん
2011/06/29(水) 23:59:08.750344デフォルトの名無しさん
2011/06/30(木) 07:08:43.640345デフォルトの名無しさん
2011/06/30(木) 08:58:03.95みたいな無神経な言い回しが何度も言われていた時期があった。
聞くほうも同じくらい無神経だから何度言っても通じないことは容易に想像できる。
0346デフォルトの名無しさん
2011/06/30(木) 09:30:47.84C++/CLIでWinForms使うなっていうのは
どうせC#わからないと使えないしC++の経験があってもC#覚えたほうが早いからC#やれってこと
C++の経験があるからC++/CLIがいいだろうと思って始めた初心者が
C#のTIPSサイトですぐ出てくるようなコントロールの使い方を質問してくるとそりゃC#やれと言いたくなる
0347デフォルトの名無しさん
2011/06/30(木) 09:58:07.10Windowsでの基本はC++だが、
WinFormでの基本はC++じゃない件
0348デフォルトの名無しさん
2011/06/30(木) 16:10:30.570349デフォルトの名無しさん
2011/06/30(木) 16:29:27.88vNextも最初のバージョンは載らないらしいし
0350デフォルトの名無しさん
2011/06/30(木) 23:34:53.54Borland時代のDelphiはまさに神言語だったんだなぁと思う
0351デフォルトの名無しさん
2011/07/01(金) 00:31:39.48C++の言語仕様が糞なだけ
0352デフォルトの名無しさん
2011/07/01(金) 00:57:16.040353デフォルトの名無しさん
2011/07/01(金) 09:30:18.330354デフォルトの名無しさん
2011/07/01(金) 09:37:09.000355デフォルトの名無しさん
2011/07/01(金) 09:53:59.450356デフォルトの名無しさん
2011/07/01(金) 17:08:23.75現実の大部分のプログラムはそうなってないんだけど
0357デフォルトの名無しさん
2011/07/01(金) 20:01:09.19それだと原発事故と飛行機事故と自動車事故と比べて騒いでる連中と同じだぞ
0358デフォルトの名無しさん
2011/07/01(金) 21:01:16.07使うライブラリによっては安全に書ける、気がする
0359デフォルトの名無しさん
2011/07/01(金) 21:35:52.26お前はもう死んでいる的なバグがずっと少ない
0360デフォルトの名無しさん
2011/07/01(金) 22:42:12.30逆に言うとガベコレ使わなくても明らかに安全な部分はCで書いていい
0361デフォルトの名無しさん
2011/07/05(火) 10:04:29.39計算部分はネイティブで書いて、GUIや描画部分は.NETにやらせることで
高速かつ生産性の高いプログラミングが出来る
・・・と、言う夢だったのさ
0362大天使 ◆uL5esZLBSE
2011/07/05(火) 13:17:03.75Cは安全性を捨てて速度得てんだよ バカか?
Cに安全性を追加したら
それは劣化C#になるから、下手に自分でかいた甘いコードで安全性をはかるよりも
C#でやるべき
お前はなんか、C++上で劣化C#作って喜んでそうなバカだな
0363デフォルトの名無しさん
2011/07/05(火) 15:20:27.620364デフォルトの名無しさん
2011/08/17(水) 15:46:40.55インテリセンス無いから入力がめんどくさい・・・
0365デフォルトの名無しさん
2011/08/17(水) 21:56:13.11一応注意しとくと2008でコンパイルした混在アセンブリは.NET4でロードできなくなるよ?
0366デフォルトの名無しさん
2011/08/17(水) 22:07:00.37http://www.wholetomato.com/default.asp
0367デフォルトの名無しさん
2011/08/17(水) 23:11:17.610368デフォルトの名無しさん
2011/08/18(木) 15:44:09.37projファイル書き替えでなんとかなるけどね
混在はapp.config無理やりつけてやるとか
0369デフォルトの名無しさん
2011/08/31(水) 22:00:08.560370デフォルトの名無しさん
2011/09/02(金) 22:58:08.400371デフォルトの名無しさん
2011/09/13(火) 13:37:36.740372デフォルトの名無しさん
2011/09/16(金) 11:52:55.12なんかわけのわからないことになってるぞ
C++/CLI切ってネイティブのC++にC++/CLI風のCOM拡張を入れるらしい
0373デフォルトの名無しさん
2011/09/16(金) 13:18:45.29.net framework用には今まで通りC++/CLIを使う。
0374デフォルトの名無しさん
2011/09/16(金) 14:44:53.44C++/CLIに比べれば至極真っ当なやり方だと思う
最初からそうしてくれてれば良かったのに
0375デフォルトの名無しさん
2011/09/16(金) 21:24:20.48それではプラットホームに依存してしまう。
0376デフォルトの名無しさん
2011/09/16(金) 21:42:24.87ネイティブコードとどう結びつけるかは実装依存でしょ
CLIに依存する記述だけ言語仕様から削ればCOMとのバインディングは実装次第ってことで問題ない
0377デフォルトの名無しさん
2011/09/19(月) 03:32:40.73作成されたウィンドウに.net framework用のコントロールを
貼ることは可能でしようか?
0378デフォルトの名無しさん
2011/09/19(月) 06:50:32.14http://msdn.microsoft.com/ja-jp/library/6xfx8bsa(v=VS.80).aspx
0379デフォルトの名無しさん
2011/09/19(月) 15:35:43.23ありがとうございます。
MFCのCViewの派生なんですね。
CView系は使いたくないのでちょっとソースを読んでみます。
0380デフォルトの名無しさん
2011/09/19(月) 20:45:06.450381デフォルトの名無しさん
2011/09/20(火) 22:52:53.28CWinFormsControl で大丈夫そうですね。
ご指摘ありがとうございます。
0382デフォルトの名無しさん
2011/09/26(月) 15:27:11.67多分わかってるだろうけど、おかしいよ。
Cは安全性を捨ててなんていない。安全性なんて無かった。
0383デフォルトの名無しさん
2011/10/12(水) 15:19:32.050384デフォルトの名無しさん
2011/10/16(日) 23:44:09.15http://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でやりたいんですけどどう書けばいいか分かる人いますか・・・
0385デフォルトの名無しさん
2011/10/16(日) 23:51:00.77C++/CLIはC++じゃないけどそれはわかってる?
そんな質問するような人がなんでC++/CLIなんか使うのか正直意味がわからない
素直にC#使うか、C++やりたいんだったらネイティブでATLやMFC使ったほうが
0386デフォルトの名無しさん
2011/10/17(月) 13:53:12.580387デフォルトの名無しさん
2011/10/17(月) 14:51:10.320388デフォルトの名無しさん
2011/10/17(月) 15:51:31.180389デフォルトの名無しさん
2011/10/29(土) 09:05:13.17みたいな感じで作られてしまって、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・・・}
と書いてたのですがここはどうすれば良いでしょうか?
0390デフォルトの名無しさん
2011/10/29(土) 09:24:47.380391デフォルトの名無しさん
2011/10/29(土) 09:30:46.120392デフォルトの名無しさん
2011/10/29(土) 09:50:02.99っていうかC++/CLIなんかやめてC#やれ
0393デフォルトの名無しさん
2011/10/29(土) 09:53:37.07ありがとうございます
そこは直しました
this->StripMenuItem1->DropDownItems->AddRange(gcnew cli::array< System::Windows::Forms::ToolStripItem^ >(5) {this->AToolStripMenuItem,this->BToolStripMenuItem,this->CToolStripMenuItem・・・}
ここに何を入れていいのかわかりません
C#もやってますがどちらにしろ初心者でわかりませんし・・・
0394デフォルトの名無しさん
2011/10/29(土) 10:15:21.39C#の入門書買って出直してきたら
0395デフォルトの名無しさん
2011/10/29(土) 16:39:02.97IntPtr 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に入っていません。どうすれば良いでしょうか?
0396デフォルトの名無しさん
2011/10/29(土) 16:58:16.15> アンマネージ ANSI 文字列から最初の null 文字に遭遇するまでのすべての文字をマネージ String にコピーし、
> 各 ANSI 文字を Unicode に拡張します。
何故、WCHAR*を入れられると思ったのだろうか
http://msdn.microsoft.com/ja-jp/library/bb384865.aspx
0397デフォルトの名無しさん
2011/10/29(土) 17:13:28.22>アンマネージ 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);で直したらできました
0398デフォルトの名無しさん
2011/10/29(土) 18:45:00.94のstripsをフォームいじっても消えないところでグローバル宣言したいのですがどうすれば良いでしょうか?
0399デフォルトの名無しさん
2011/10/29(土) 19:27:05.70ANSI 文字列って書いてるんだから違うものを入れるなよ
しかも、文字列のマーシャリングとか>>397のリンク先を見れば一発で解決するような超FAQだから、
そんな無駄なコードなんか貼らなくていいよ
0400デフォルトの名無しさん
2011/10/30(日) 00:13:45.13クラス直下に書いとけば
そんなレベルで試行錯誤してても時間の無駄だよ
悪いことは言わないからちゃんと1から言語を勉強してきたほうがいい(C#かCLIじゃない方のC++を)
0401デフォルトの名無しさん
2011/10/30(日) 00:22:47.790402デフォルトの名無しさん
2011/10/30(日) 00:25:17.380403デフォルトの名無しさん
2011/10/30(日) 00:32:43.14vectorとかの方が良いんですか?
0404デフォルトの名無しさん
2011/10/30(日) 00:35:25.75動的に要素数を変えたいならSystem::Collection::Generic::List<T>を使う
もういいからC#やれ
0405デフォルトの名無しさん
2011/10/30(日) 00:36:42.680406デフォルトの名無しさん
2011/10/30(日) 00:38:40.010407デフォルトの名無しさん
2011/10/30(日) 00:53:12.14array<Hoge^>^%はC#だとref Hoge[]で味気ない
0408デフォルトの名無しさん
2011/10/30(日) 21:28:13.45改行しません。どうしてでしょうか?
0409デフォルトの名無しさん
2011/10/30(日) 21:39:23.47ありがとうございました
0410デフォルトの名無しさん
2011/10/31(月) 01:30:07.13コンパイルは通るし画面のテキストボックスにも文字はちゃんと表示されてるのに
オブジェクト参照がオブジェクト インスタンスに設定されていません とエラーが出て止まります。どうすれば良いですか?
0411デフォルトの名無しさん
2011/10/31(月) 02:45:15.470412デフォルトの名無しさん
2011/10/31(月) 02:53:26.620413デフォルトの名無しさん
2011/10/31(月) 06:25:43.590414デフォルトの名無しさん
2011/10/31(月) 06:27:02.150415デフォルトの名無しさん
2011/10/31(月) 08:46:35.870416デフォルトの名無しさん
2011/10/31(月) 23:46:48.11C#のソースも追加出来ますが(Prof以上のみ?)、
C++/CLIからそのC#のクラスを使えますか?
C#からC++/CLIのクラスは使えるようですが・・・
0417デフォルトの名無しさん
2011/11/01(火) 00:03:00.110418デフォルトの名無しさん
2011/11/01(火) 00:03:25.92混ぜてコンパイルは無理。
dllを参照して使用するのは相互に可能。
0419デフォルトの名無しさん
2011/11/01(火) 00:35:20.55大人しくプロジェクト分けるしかないのですね・・・
0420デフォルトの名無しさん
2011/11/06(日) 15:39:11.10どこにコードを書けばいいですか?
pictureBox_Paint内だと起動直後の一瞬しか表示されません
0421デフォルトの名無しさん
2011/11/06(日) 15:50:26.290422デフォルトの名無しさん
2011/11/06(日) 16:39:49.740423デフォルトの名無しさん
2011/11/09(水) 16:12:12.500424デフォルトの名無しさん
2011/11/10(木) 07:34:24.84ネイティブ(アンマネージド)なC++の静的ライブラリを
C++/CLIでリンクして使うと変な所で死んだりするんだけど、
こういう事しちゃだめなのでしょうか?
一旦ネイティブなDLLを作って、そこを介して呼べば死なないのですが・・・。
そのライブラリは実装を隠蔽するため
クラスのインタフェース部分のみ公開して、
インスタンスの生成と開放を関数化してあるのですが、
つまりはnew/deleteがライブラリ内で実行され、
ライブラリ内でnewした結果を返し、マネージドコード内で保持し、
そのポインタをライブラリに渡してdeleteしてもらう形になっています。
よく分からないのは、わざとnewをせずポインタをNULLで初期化したままにしておき、
「NULLでなければ開放関数を呼ぶ」というコードを書いただけでも、
そこで死んでしまうのです。(NULLなので開放関数は呼ばれない!)
vectorヘッダをインクルードするかしないかで、死んだり死ななかったりと、
挙動がおかしすぎて正直よく分からない状況です。
0425デフォルトの名無しさん
2011/11/10(木) 16:05:38.550426デフォルトの名無しさん
2011/11/12(土) 18:54:13.340427デフォルトの名無しさん
2011/11/12(土) 23:05:46.09で作成されたフォームに
元のフォームにある文字列変数を渡す方法があったら教えてください
0428デフォルトの名無しさん
2011/11/12(土) 23:10:34.52つかそれだとC#もC++もさっぱりだよね? ならまだ遅くないから今すぐC#に乗り換えること。
0429デフォルトの名無しさん
2011/11/13(日) 20:42:15.740430デフォルトの名無しさん
2011/11/13(日) 21:12:34.820431デフォルトの名無しさん
2011/11/13(日) 21:53:59.800432デフォルトの名無しさん
2011/11/17(木) 00:53:02.53指定された名前のグローバル関数を呼び出すことは可能ですか?
0433デフォルトの名無しさん
2011/11/17(木) 01:19:51.91クラスの静的メンバにする
0434デフォルトの名無しさん
2011/11/17(木) 01:37:36.370435デフォルトの名無しさん
2011/11/17(木) 14:05:35.230436デフォルトの名無しさん
2011/11/23(水) 22:13:47.85プロジェクト全体でつかうような関数です。
stdafx.hに書いたら
error LNK2005: "int __clrcall testfunc(void)" (?testfunc@@$$FYMHXZ) は既に stdafx.obj で定義されています。
ってエラーが出るのですが( ;∀;)
0437デフォルトの名無しさん
2011/11/23(水) 23:10:37.60C++/CLIというか、C++の基本から勉強し直してこい
0438デフォルトの名無しさん
2011/12/07(水) 06:58:01.680439デフォルトの名無しさん
2011/12/07(水) 07:29:07.570440デフォルトの名無しさん
2011/12/07(水) 15:36:45.42別々のソースでインクルードされてコンパイルして、
それらをリンクしたら同じ名前の関数が複数出来上がってるわけだし。
と、ついでに質問者に説明してみる
0441デフォルトの名無しさん
2011/12/07(水) 18:59:29.54スマヌ
0442デフォルトの名無しさん
2011/12/12(月) 18:04:16.59cli::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> ^' に変換できません。
とエラーが出るのですが、どうすればよいのでしょう
どなたかご教示ください。
0443デフォルトの名無しさん
2011/12/12(月) 21:18:25.11■ このスレッドは過去ログ倉庫に格納されています