- 1 名前:デフォルトの名無しさん [2010/03/20(土) 02:15:38 ]
- このスレッドは
「どんなにくだらないC#プログラミングに関する発言でも誰かが優しくレスをしてくれるスレッド」です。 ほかのスレッドでは恐ろしくて書き込めないような低レベル、もしくは質問者自身なんだか意味がよく分からない質問、 ググろうにもキーワードが分からない場合など、勇気をもって書き込んでください。 内容に応じて、他スレ・他板へ行くことを勧められる、あるいは誘導される場合がありますがご了承下さい。 なお、テンプレ2行目が読めない回答者は邪魔なので後述のC#相談室に移動して下さい。 >>980を踏んだ人は新スレを建てて下さい。 >>980が無理な場合、話し合って新スレを建てる人を決めて下さい。 ふらっとC#,C♯,C#(初心者用) Part56 pc12.2ch.net/test/read.cgi/tech/1267348401/ 関連スレ C#, C♯, C#相談室 Part55(実質56) pc12.2ch.net/test/read.cgi/tech/1260111240/1 VB.NET質問スレ(Part33) pc12.2ch.net/test/read.cgi/tech/1263738929/1 C++/CLI part3 pc12.2ch.net/test/read.cgi/tech/1206447234/1
- 620 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 16:38:26 ]
- int[] table;
これはifの前に宣言だけして table = new int[]{02, 0, 180, 90}; とかでできない?
- 621 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 16:41:40 ]
- >>617
前者 どんな環境でも動くことは動くけどバリバリのDirect3Dで描画されてるから ハードウェアアクセラレーションが十分に効かない環境では厳しい
- 622 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 16:44:30 ]
- >>616
これで一応エラーでないけどコメントの箇所何かいれないと何も設定されない条件ができないか? ideone.com/JFPMtwVZ
- 623 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 16:44:41 ]
- >>616
int[] table = null; にするか if() 〜〜 else 〜〜 とするか お好きなのをどうぞ
- 624 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 16:46:13 ]
- >>621
回答ありがとうございます。 なるほど、やはりそのような理由ですか。 了解しました。 スレチなのでWPFのことは別スレで聞いてみたいと思います。 みなさん、いろいろとありがとうございました。
- 625 名前:デフォルトの名無しさん [2010/03/28(日) 16:47:21 ]
- >>620
new int[]でできました。 ありがとうございました。 これをつけるのとつけないのとでは、どう意味が違うんですか?
- 626 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 16:50:23 ]
- >>625
いろいろ短縮したのが table = new int[]{01, 0, 120, 270}; これね 長くかくと table = new int[4]; int[0] = 01; int[1] = 0; int[2] = 120; int[3] = 270; こうなる
- 627 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 16:50:50 ]
- >>625
アホか。エラーメッセージに全部書いてあるだろ。
- 628 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 16:53:15 ]
- ああああああ
間違えた table = new int[4]; table[0] = 1; table[1] = 0; table[2] = 120; table[3] = 270;
- 629 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 16:57:27 ]
- table = new int[]{01, 0, 120, 270};
こうやって書くメリット?は table = new int[4]; table[0] = 1; table[1] = 0; table[2] = 120; table[3] = 270; この配列に table[4] = 100; とか増やしたい場合は table = new int[4]; これを table = new int[5]; としないといけないけど table = new int[]{01, 0, 120, 270,100}; こうするだけで{}で囲った中の要素分だけ勝手に配列を確保してくれる。 数を知りたければ配列の場合.Lengthでわかるはず
- 630 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 17:05:07 ]
- >>590
こっちはまだわかりやすいね 訳が適当だとどうにでも解釈できるよな
- 631 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 17:11:45 ]
- >>616
普通にこれだけでいける table=new []{0,1,2,3,4}
- 632 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 21:49:36 ]
- >>631
アホか。
- 633 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 23:50:29 ]
- 配列なんて使わずArrayList使おうよ
- 634 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 23:51:52 ]
- intの配列の初期化がまともにできないレベルだからなあ
もうちょい先だろ
- 635 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 23:53:00 ]
- うひゃあうひゃあ
配列とか扱うのはメモリ効率悪いwww
- 636 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 00:08:06 ]
- 男なら配列なんか使うな!
- 637 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 00:13:42 ]
- いまどき配列を嫌う男の人って…
- 638 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 00:28:06 ]
- 大した弊害なくて使えるなら何だって良いさ
- 639 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 00:34:17 ]
- ですね
- 640 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 03:59:41 ]
- volatile の効果が実感できるソースコードの例は無いでしょうか?
簡単なコードでは実感できないような修飾子なのでしょうか。
- 641 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 06:16:01 ]
- 無理
- 642 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 06:19:56 ]
- そもそも初心者には使う必要のない修飾子
- 643 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 06:39:07 ]
- VSの設定保存機能って使ってる?
ビルドしたらなんとか.exe.configとかいう名前で生成されるやつ。 自分で用意してるから使わないんだけど、生成させないようにするのはどうするの?
- 644 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 06:47:40 ]
- App.configを消せばいい。
- 645 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 06:51:00 ]
- >>644
おー、サンクス。さっそく除外しとこう。
- 646 名前:デフォルトの名無しさん [2010/03/29(月) 09:13:16 ]
- ArrayListって内部的にリスト構造なの?
Listとどう違うの? リスト構造だとインデクサ[]は使えるとしてもアクセス効率 が悪いと思うけど
- 647 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 09:18:19 ]
- >>646
いや配列 配列の容量あふれると別の容量大きめの配列作ってコピーするから時々追加にO(n)かかる ArrayListはList<object>だった気がするなぁ〜 使わないから覚えてない…
- 648 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 09:20:00 ]
- ListはArrayListのGenericだから比べるところじゃないだろう
ListとArrayListの中身は配列 >ArrayList は、null 参照 (Visual Basic では Nothing) を有効な値として受け取り、要素の重複を許可します。 >Count が既に Capacity に等しい場合には、内部配列を自動的に再割り当てすることにより ArrayList の容量が増加し、新しい要素を追加する前に既存の要素は新しい配列にコピーされます。 >Count が Capacity より小さい場合、このメソッドは O(1) 操作になります。新しい要素を格納するために容量を増やす必要がある場合、このメソッドは O(n) 操作になります。ここで、n は Count です。
- 649 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 09:21:07 ]
- ArrayListは過去の遺物。要素がobjectの場合でもList<object>を使った方がいい。
Silverlightでは切り捨てられた。
- 650 名前:デフォルトの名無しさん [2010/03/29(月) 10:13:51 ]
- ありがとう。Listという言葉が紛らわしいですね。
C#の参考書を見ると、Windows GUIが簡単にできそう。 MFCを整理してより使い易くしているかんじ。 C++のMFCを勉強してきたけど、きっぱりとあきらめて C#で作り直した方が早いと思う。
- 651 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 10:47:41 ]
- ArrayListやHashtableって実装をさらけ出した悪い名前だと思う
- 652 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 10:54:34 ]
- そこがメリット
- 653 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 10:58:07 ]
- Java由来の名前だが、実装を示唆するような名前でないと速度の見積もりができないので、あれはあれでよい。
- 654 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 11:01:25 ]
- >>650
MFCを使ってる人がまだいたことに驚いた
- 655 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 11:05:19 ]
- listといえばリンクリストを指すのは悪い慣習だな
.NETではインデックスでアクセスできるものをlistと呼ぶ LinkedListもListと付いてるけどIListを実装してない
- 656 名前:デフォルトの名無しさん [2010/03/29(月) 12:24:01 ]
- WPFのC#のコードビハインドでのウィンドウサイズの指定方法を教えてください。
xamlでは、 <Window Height="400" Width="400"> と指定します。 FormのC#では、 this.ClientSize = new System.Drawing.Size(1173, 861); のようにできます。 WPFのC#の場合がわかりません。 Windowssize = new System.Drawing.Size(1173, 861); としてみたところ、System.Windows.Window.Windowsizeはアクセスできない保護レベルになっています、 と表示されています。 どこで保護レベルを変更すればよいでしょう? よろしくお願いします。
- 657 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 12:25:00 ]
- 保護レベル変更は無理
- 658 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 12:26:55 ]
- this.Width = 1173;
this.Height = 861; これだけ それとWPFでSystem.Drawingは使うな
- 659 名前:デフォルトの名無しさん [2010/03/29(月) 12:27:07 ]
- >>657
やりたいことはウィンドウサイズの変更なので、 ウィンドウサイズを変更できればよいです。
- 660 名前:デフォルトの名無しさん [2010/03/29(月) 12:29:59 ]
- >>658
ありがとうございました。できました。感謝です。
- 661 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 17:27:28 ]
- >>660
また俺が回答してやるよ どーんとこい!
- 662 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 18:34:08 ]
- いや俺が回答した
- 663 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 18:40:04 ]
- いやいや俺が
- 664 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 19:08:57 ]
- あ、じゃあ
俺がやったよ
- 665 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 20:47:38 ]
- 質問
現在、C言語で書かれたDLLが提供する関数を C#から呼び出そうとしています。 悩んでるが、「引数に構造体の配列を持つ関数」の処理です。 下記URLにソースコードを張りました codepad.org/SnH7gdwI 上でいう所のC側の「//<- ここで落ちる」というコメントのある所で不正アクセスで落ちてしまいます。 (stSample[0]に値が入ってるのは確認できました) C#側の構造体の渡し方がおかしいとかなと思ってるのですが、 どこがおかしいのか分からず・・・。 ご存知の方いましたら、教えて下さい。
- 666 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 20:52:16 ]
- public struct ST_SAMPLEDLL {
public byte cCount; public fixed byte strBuff[256]; } こうじゃね
- 667 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 21:18:54 ]
- 文字列にしてそれを渡してパースしてぶっこめば楽だな
- 668 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 21:35:23 ]
- 教えてください。
マルチスレッドを利用したプログラムがあります。 このスレッドのうち1本で、ローカルファイルにデータを出力する処理があり、そのファイル名を ファイル選択ダイアログ(System.Widows.Forms.SaveFileDialog)を利用して求めることにしたいと思います。 実際にプログラムを組んで実行すると、ShowDialog() を実行する箇所でエラー終了します。 メッセージボックスに表示されるエラーの内容は以下の通りです。 >OLE が呼び出される前に、現在のスレッドが Single Thread Apartment (STA) モードに設定されていなければなりません。 main 関数には STAThread の設定もしてあります。(元からついているようですが) 同じプログラムで、main 関数を実行したスレッド(以下、メインスレッドと記述します)でダイアログを表示すると正常に使用できます。 また、メインスレッドで開けばいいのかと、メインスレッドで表示しているフォームに Invoke を掛けて ダイアログを表示すると正常に使用‥‥出来るのですが、このフォームは最小化&非表示にしているため この状態でダイアログを表示しようとしても画面には出てきません。 メインスレッド以外からファイル選択ダイアログを正常に開く方法はないでしょうか。
- 669 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 21:44:03 ]
- UIスレッド以外から操作すんなよ。
- 670 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 21:45:43 ]
- ダイアログに見せかけたFormじゃだめなの?
- 671 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 21:49:18 ]
- メインスレッド側でAPIで呼べばいいんじゃね?
- 672 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 21:50:38 ]
- あー、Thread.SetApartmentStateってのがあってだね
- 673 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 21:50:49 ]
- 一応、Thread.TrySetApartmentState メソッド ってのはあるけどな・・・。
- 674 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 21:52:26 ]
- >>669-671
この3人にtaskkillしてあげてください
- 675 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 21:53:44 ]
- ひどい赤っ恥だ
- 676 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 21:56:37 ]
- メインのUIスレッド以外からUIいじるのはお勧めできないけどな。
- 677 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 21:58:40 ]
- >>674
何でtaskkillなんだよ >ダイアログを表示すると正常に使用‥‥出来るのですが、このフォームは最小化&非表示にしているため >この状態でダイアログを表示しようとしても画面には出てきません。 ダイアログで出ないとかいうからダイアログに見せかけたForm表示しろっていっただけ オーナーとの関係で表示がされないだけだろ
- 678 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 21:59:11 ]
- そのスレッドは自分で作ったスレッド?
それともスレッドプールのスレッド? 自分で作ったスレッドなら、差し支えなければ自分でSTAに設定すればいい(Start前しかできないよ) もしスレッドプールとかなら、これはMTAから変更することはできない。 汚いけど、必要な部分で自分でスレッド作って、STAに設定してメッセージボックス表示、 元のスレッドでは新しいスレッドを勝ち合わせとかするしかないと思う。 最初からUIスレッドにIncvokeする方が無駄はないけど。
- 679 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 22:01:42 ]
- そもそもSTAとかMTAって何なの
- 680 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 22:02:56 ]
- ようやくシンプルだけどまともに動くものが作れるようになってきたけど
未だにマルチスレッドとかよくわからないな >>679も何のことやら
- 681 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 22:05:41 ]
- Inside OLE2 嫁。
- 682 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 22:09:36 ]
- >>681
それ絶版じゃなかったっけ。
- 683 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 22:10:41 ]
- うん。
- 684 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 22:11:22 ]
- >STAとかMTA
VC++でATL使ってIEコンポーネント触ったときにちょっとかじった程度だな ナビゲーション関連がこの辺を理解してないとメッセージが来ないとかなんとか
- 685 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 22:24:31 ]
- うん。
- 686 名前:668 mailto:sage [2010/03/29(月) 22:26:02 ]
- みなさん、ありがとうございます。
てか、はやっ。w >>670 無知ですみません。 ダイアログに見せかけたフォームというのは、Form を継承したファイル選択ダイアログの ようなフォームクラスを自分で作る、と言うことでしょうか。 だとすると、今回は遠慮できたらいいかな、と。すみません。 >>671 いまの状況からは少し難しく。すみません。 >>678 System.Threading.Thread を利用して自分で作ったスレッドです。 やっとエラーメッセージの意味がわかりました。 あれは必ずしも main 関数でやれってことではなくて、ダイアログを操作するスレッドに STA を設定しろってことなんですね。 >>672 や >>673 さんの仰ってる方法で出来ると理解しました。明日、確認します。 >>669,676 自分も UI スレッド(この言葉を忘れていました)以外で UI の操作を行うのには抵抗があったのですが。 ‥‥気をつけておきます。
- 687 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 22:27:30 ]
- >>686
わかればよろしい 今後も精進しなさい
- 688 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 22:28:10 ]
- 偉そうに
- 689 名前:665 mailto:sage [2010/03/29(月) 22:32:50 ]
- >>666
レスサンクス。 バッファの取り方がまずいという事ですか。 今手元に環境がないので試せないですが、 明日試してみます。 良いサイトか何かあれば、いいんですが、 なかなか見つからず・・・orz ちなみに、環境は XP,VC# 2008Express (書き忘れました)
- 690 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 22:37:59 ]
- バッファの取り方でなくて、C#とCの型の違い。
- 691 名前:665 mailto:sage [2010/03/29(月) 22:42:37 ]
- >>690
サンクス それで、最初の構造体はアクセスできるけど(たまたま出来てるように見えてるだけ?)、 次の構造体にアクセスしようとしたら落ちると・・・。
- 692 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 22:46:49 ]
- 型の制約があるものより汎用的なテキストでやり取りする方が無難かもねえ
相談かこっちか忘れたけど以前同じようなdllを呼び出すアプリの相談で httpでやり取りする形にしてみたら?ってのがあったな
- 693 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 22:52:56 ]
- >>691
よく見たらST_SAMPLE**だったのか C#側の引数の型をIntPtr[]にしてそれぞれポインタの参照先に ST_SAMPLEDLL一つ分のメモリを割り当てておかないと
- 694 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 22:53:47 ]
- バイト配列が一番わかりやすいよ。
- 695 名前:665 mailto:sage [2010/03/29(月) 22:58:22 ]
- >>692
時間がたっぷりあって、許されるなら、DLLをC++か何かで 書き換えたいところですが、そうもいかず・・・。 このインターフェースは我慢するしかないですね。 >>693 です。ダブルポインタです。 そこなのですが codepad.org/SnH7gdwI このサイトに張ったソースの37行目でDLLに渡すメモリの実態自体は用意しているので、 大丈夫かと思ってたのですが、それとは別に確保するという事ですか? あと、宣言は、こっちの方がいいってことですね。 [System.Runtime.InteropServices.DllImport("MY_Dll.dll", EntryPoint = "test")] unsafe public static extern int test_call( IntPtr[] pstList);
- 696 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 23:00:44 ]
- IntPtrのみでいいはずだけどな。
Cでは、基本的に配列はメモリ上に整列するし。
- 697 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 23:04:37 ]
- ダブルポインタだからポインタの配列を渡さないといけない(だからIntPtr[])
しかもC側でポインタの参照先にアクセスしてるから予めそれぞれ実体を割り当てとかないと
- 698 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 23:11:52 ]
- 配列はポインタで受けれるけど、ってやつか。
- 699 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 23:12:03 ]
- >>696
私もそう思ってて、そこではまってます。。 >>697 >しかもC側でポインタの参照先にアクセスしてるから予めそれぞれ実体を割り当てとかないと そこなのですが、 testPtr1 = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(ST_SAMPLEDLL)) * (int)10); これで、領域を確保して、 次に test_call(testPtr1); 渡してるので、少なくとも構造体ST_SAMPLEDLLを10個分はメモリとして 確保してると思ってますが、この処理のほかに必要とうい事でしょうか? その後、取れたのをMarshal.PtrToStructure()で取り出す処理になってます。
- 700 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 23:15:27 ]
- = () => って表記、他に候補なかったのかよ!と書く度に思う。タマゴとコンニャクでオデン喰いたくなるw
- 701 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 23:21:09 ]
- C#でいう「参照型の配列」と同じだ。
並んでるのは実体じゃなくてポインタで,それぞれのポインタがどこか別の場所にある実体を参照してる。 IntPtr[] testPtr1 = new IntPtr[10]; for (int i = 0; i < 10; i++) { testPtr1[i] = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(ST_SAMPLEDLL))); } test_call(testPtr1); こうする。 取り出すときはそれぞれの要素に対してMarshal.PtrToStructureを呼べばおk
- 702 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 23:27:48 ]
- DLLとC#の間にもう一個DLL挟めばいいんだよ
- 703 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 23:29:37 ]
- >>701
なんといいますか・・・。 頭が下がるばかりです。 なるほど、納得しました。
- 704 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 23:32:31 ]
- もともと
x⇒x*2; みたいな感じではなかったのあれ 1バイト文字に⇒がなかったから代用みたいな よくしらんけど
- 705 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 23:35:16 ]
- これで上手くいったと書こうと思ったら>>701に先越された。CallingConvention忘れないでね。
using System; using System.Runtime.InteropServices; [StructLayout(LayoutKind.Sequential, Pack=4)] public struct ST_SAMPLEDLL { public byte cCount; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)] public byte[] strBuff; } class Hoge { [DllImport("u.dll", EntryPoint = "test", CallingConvention=CallingConvention.Cdecl)] unsafe public static extern int test_call([MarshalAs(UnmanagedType.LPArray), In, Out] IntPtr[] pstList); static void Main() { IntPtr[] stSample = new IntPtr[10]; for (int i = 0; i < stSample.Length; ++i) { stSample[i] = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(ST_SAMPLEDLL))); } // DLL呼び出し test_call(stSample); ST_SAMPLEDLL[] st = new ST_SAMPLEDLL[10]; for (int i = 0; i < st.Length; ++i) { st[i] = (ST_SAMPLEDLL)Marshal.PtrToStructure(stSample[i], typeof(ST_SAMPLEDLL)); Marshal.FreeCoTaskMem(stSample[i]); } Console.WriteLine((int)st[0].cCount + " " + (int)st[0].strBuff[0]); Console.WriteLine((int)st[1].cCount + " " + (int)st[1].strBuff[0]); }}
- 706 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 23:40:06 ]
- なんでCdecl?
- 707 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 23:40:19 ]
- >>705
なんていうか・・・俺って頭の回転速いから自然と先越しちゃうんだよ。(笑) 肩を並べる奴は誰も現れないって感じだ。(笑)
- 708 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 23:41:32 ]
- >>707
おい 俺のフリをするな
- 709 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 23:42:58 ]
- >>706
codepad.org/SnH7gdwI で__stdcallが指定されていないから。 まさかコンパイルオプションでstdcallを指定しているなんてオチがあるわけないと思ってCDeclと仮定した。
- 710 名前:701■Agei32s4 mailto:sage [2010/03/29(月) 23:44:05 ]
- 騙りばっかだな。トリつけとくわ。
- 711 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 23:44:35 ]
- ですね
- 712 名前:665 mailto:sage [2010/03/29(月) 23:55:44 ]
- >>705
>>709 具体例、サンクス! 少し話しが出たので、質問なのですが、 DLL側で__stdcallが指定されていた場合、話しは違ってくるのでしょうか?
- 713 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 23:59:11 ]
- うん。
- 714 名前:デフォルトの名無しさん mailto:sage [2010/03/30(火) 00:01:18 ]
- 文字列でやり取りするのが今時
- 715 名前:デフォルトの名無しさん mailto:sage [2010/03/30(火) 00:02:31 ]
- そんなことない。
- 716 名前:デフォルトの名無しさん mailto:sage [2010/03/30(火) 00:03:15 ]
- WinFormsのP/Invokeを全部標準入出力に替えたらとんでもないことになるな
- 717 名前:デフォルトの名無しさん mailto:sage [2010/03/30(火) 00:06:56 ]
- >>715
ネットワーク越しにwebAPI呼び出してxmlなどのテキストで回答を許容できる時代なんだから スタンドアロンでやっても問題ないだろ そうすればGUIだけC#で書いて古いDLLは常駐してhttpをリスナーする小さいプログラム書けば いいのでVC++の無料でも余裕で開発できる
- 718 名前:デフォルトの名無しさん mailto:sage [2010/03/30(火) 00:07:42 ]
- どんだけ遅いと思ってんだよ。バカジャネーノ
- 719 名前:デフォルトの名無しさん mailto:sage [2010/03/30(火) 00:08:00 ]
- >>713
実は、会社の帰り際に「WINAPIは__stdcallで宣言するのが標準」という記事を見つけたので、 淡い期待を抱きながら、「明日試そう・・・」と思っていたところでした。 スタックの開放タイミングの違いとうい事ですか(う〜ん汗)
- 720 名前:デフォルトの名無しさん mailto:sage [2010/03/30(火) 00:12:45 ]
- 直接は関係ない。関数から戻るときの問題だし。
|

|