[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 08/16 23:53 / Filesize : 244 KB / Number-of Response : 980
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C#, C♯, C#相談室 Part46



1 名前:デフォルトの名無しさん [2008/04/22(火) 00:31:59 ]
(#゚ー゚)つ < C#、.NETの話題はこちらでどうぞ。
c++厨の嵐はスルー汁。

前スレ
C#, C♯, C#相談室 Part45
pc11.2ch.net/test/read.cgi/tech/1200911737/

その他テンプレ>>2-5くらい

66 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 08:21:06 ]
コピペ君って馬鹿だな、まで読んだ。

コピペ君ってただのコピペに存在意義があると思ってるのかねひょっとして。
まあ普段無能で役立たずだと人に思われてるから、こんな「せせこましい」ことでもして
人に自分の価値を認めてもらいたいんだろうなw

67 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 12:14:53 ]
>>66 他人を見下すのに必死なんですね。わかります

68 名前:デフォルトの名無しさん [2008/05/01(木) 16:37:27 ]
誰か、より良い方法があったら教えてください。
// 何箇所も変更場所があるのは好ましくない
class MyComponent1
{
 string myProperty = "初期文字列";
 [DefaultValue("初期文字列")]
 public string MyProperty { get { return myProperty; } set { myProperty = value; } }
 public MyComponent1() { }
}

// リファクタリングで MyProperty を書き換えると GetProperty("MyProperty") に変更が入らない
// 結局複数個所を書き換える方が見通しがいい
class MyComponent2
{
 string myProperty;
 [DefaultValue("初期文字列")] // ここを書き換えたら myProperty の初期値にも反映したい
 public string MyProperty { get { return myProperty; } set { myProperty = value; } }
 public MyComponent2()
 {
  var defaultValue = typeof(MyComponent2).GetProperty("MyProperty").GetCustomAttributes(typeof(DefaultValueAttribute), false)[0];
  myProperty = defaultValue.ToString();
 }
}

69 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 18:09:05 ]
const string DefaultMyProperty = ゙初期化文字列゙;
string myProperty = DefaultMyProperty;
[DefaultValue(DefaultMyProperty)]
public string MyProperty {...}

70 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 21:45:22 ]
>>68
こういうユーティリティクラスを作っておくとか。
ttp://d.hatena.ne.jp/NyaRuRu/20071228/p2
public static class Reflector
{
  static PropertyInfo GetPropertyInfo(this Expression expression)
  {
    var findprop = default(Func<Expression, PropertyInfo>);
    findprop = expr =>
    {
      switch (expr.NodeType)
      {
        case ExpressionType.Lambda:
          return findprop((expr as LambdaExpression).Body);
        case ExpressionType.Quote:
          return findprop((expr as UnaryExpression).Operand);
        case ExpressionType.MemberAccess:
          return (expr as MemberExpression).Member as PropertyInfo;
        default:
          return null;
      }
    };
    return findprop(expression);
  }
  public static PropertyInfo Property<TArg, TResult>(Expression<Func<TArg, TResult>> expr)
  {
    return expr.GetPropertyInfo();
  }
}
使い方。
var defaultValue = Reflector.Property((MyComponent2 comp) => comp.MyProperty).GetCustomAttributes(typeof(DefaultValueAttribute), false)[0];
これでリファクタリングしても一緒に名前が変わるはず。

71 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 01:54:18 ]
>>69
アトリビュートには const メンバーが使えるんだ、気付かなかった。

>>70
ありがとうございます、今回は単純なので const でいこうと思いますが、大変参考になりました。
これは、ものすごく応用範囲が広いと思います、今後何かと役に立ちそうです。

72 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 18:22:19 ]
ListViewのListViewItemSorterプロパティをVSから設定するには
どうしたら良いですか?
プロパティの項目を見てもListViewItemSorterが無いのですが。

73 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 18:35:15 ]
>>72
インターフェイスだから、本体を実装しないと設定できないので、デザイナにあっても意味がないんですよ。
実際に使ってみると分かるよ。

74 名前:デフォルトの名無しさん [2008/05/02(金) 22:40:32 ]
iTextSharp使ってテンプレート読込んだけれど、その後の文字描画がテンプレートの下に隠れてしまうが、
レイヤの順序を操作する方法とかあるのでしょうか?
テンプレート読込み後に文字描画しても、その逆でも同じように隠れますが。



75 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 11:10:42 ]
721 名前:デフォルトの名無しさん :2008/05/02(金) 19:08:31

MSは.NETをいいかげん諦めたらいいのに。
Javaはほぼ全てのOSでサポートされてるから、仮想マシンという考え方が現実に役に立ってるが、
.NETのCLRはXP以降のWindowsでしか完全に動作しないし、
処理が重くなる以外、糞の役にも立っていない。

VistaがLonghornと呼ばれてた頃は、.NETがネイティブAPIになり、
Win32APIはなくなるとかいわれて、騙されて慌てて.NETを始めた犠牲者が、
騙されたことに気づいた今でもモッサリプログラムを作り続けてると思うとうんざりする。

結局Win32で作られた軽快なアプリ資産があるかぎりWin32APIは永遠になくすことができないし、
そのために.NETは永遠に脇役でモッサリのまま。
これが現実。

738 名前:デフォルトの名無しさん :2008/05/02(金) 20:26:23

.NETの元凶は、遅くなるだけで存在意義がないCLRにあるんだから、
MSは.NETのクラスライブラリと完全互換のネイティブC#を出せばいいんだよ。
開発プラットホームのスタンダード争いは完全にJavaに敗北したんだから、
もうJavaと張り合うためにバーチャルマシンに拘る必要はない。
速くて快適なEXEを作れる言語の方が誰にとっても実利的だろ。
そして.NET Frameworkにはひっそりと死んでもらうと。

大体、ビルゲイツが一線を退いてからのMSはVistaとか.NETとか失敗だらけで見てられない。
顧客(開発者、ユーザ)を苦しめることばかりしている。

76 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 11:45:53 ]
>>75
そんな元スレで失笑買ってたレスをこぴってこなくても

77 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 12:08:59 ]
VC++ の頃: DWORD ? LPSTR ? 何それ?
C# に移行してから: DWORD や LPSTR がない?
一体どういうこっちゃ。 ('A`)

78 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 12:40:41 ]
なにがいいたいのかわからない

79 名前:デフォルトの名無しさん [2008/05/03(土) 13:00:34 ]
つまり慣れってことですね、わかります

80 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 13:46:10 ]
pHandle = OpenProcess(PROCESS_VM_READ, FALSE,PID); // ハンドルの取得
if(pHandle == NULL) // 失敗時の処理
{
cout << "Cannot Open Process !" << endl;
exit(-1);
}
buf = (LPSTR)malloc(READ_SIZE); // バッファの確保
ReadProcessMemory(pHandle,Adr,buf,READ_SIZE,NULL);
CloseHandle(pHandle);
fp = fopen("Result.bin","wb");
fwrite(buf,READ_SIZE,1,fp);
free(buf);

に相当する操作をC#でAPIを使わずに書きたいんだけど、どうすればいいんでしょうか?

81 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 13:46:13 ]
>>76
詳細希望

82 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 13:57:53 ]
>>80
無理

83 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 13:59:26 ]
>>81
ここ
pc11.2ch.net/test/read.cgi/tech/1207063618/

84 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 14:01:44 ]
APIを使わずにってのはどういう要求なんだろう
WinFormsの中でだって大量に使われているのに



85 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 14:08:06 ]
コピペ君って馬鹿だな、まで読んだ。

86 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 14:18:03 ]
C/C++ だと何行も書かないといけないけどC# なら2,3行でさくっと出来るって聞いてC# に移行した。
要は楽をしたいだけ。API を使ってごちゃごちゃやらなきゃいけないんじゃC#に移行した意味がない。

87 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 14:28:04 ]
だれがそんな嘘を吹き込んだんだよ

88 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 14:30:16 ]
>>80みたいなことにC#を使うのが間違い

89 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 16:25:50 ]
C#でXMLを扱う勉強をしています。
XMLに入っている大量のデータ(IDと名前)を読み込んで、
プログラムに入力されたIDとマッチさせて名前等のデータを表示させたいのですが
どのようなアプローチをするのがいいのでしょうか?
検索は何度でも行えるようにしたいので、その都度ファイルにアクセスするのは効率が悪そうだし
かといって膨大なデータを全て配列等に格納するのも資源の無駄遣いのような気がして悩んでいます。

XMLの構造は
<Person>
<ID>774</ID>
<Name>Hiroyuki</Name>
</Person>
が延々と続いたものです。

90 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 16:31:47 ]
どんだけ膨大か知らんけど普通にオブジェクトのコレクションとして取り込めばいいんじゃない?
内部でXMLとして保持する意味なんて無いっしょ。

91 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 16:39:40 ]
>>89
>検索は何度でも行えるようにしたいので、その都度ファイルにアクセスするのは効率が悪そうだし

2回目以降はキャッシュに載ってると思うけど。
結局OSのディスクキャッシュと同じものを作ることになるんじゃない?

もちろんアプリケーションサイドでやればOSのディスクキャッシュより効率は良くなるだろうけど
費用対効果考えて判断すればいいんじゃなかろうか。

OSのディスクキャッシュよりもヒット率の低いデータをメインメモリにため込むのはよろしくないと思う。

92 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 16:51:40 ]
キャッシュのことは完全に頭から抜けていました。
データをメモリに展開しない方向で考えてみます。

93 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 02:38:28 ]
LINQの出番

94 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 07:21:32 ]
ここでしていいのか微妙な質問なのですが・・・
Visual Studio 2005で作成しWebサイトの作成をしているのですが、
aspx側のJavaScriptで記述されたfunctionを、cs側のイベントの途中で記述して
呼び出したいのですが、どうしても方法を思い出せません。

順番としてはボタン等によるイベント→aspx画面表示→JavaScript呼び出しよるアラーム等
でできるはずなのですが、どなたかわかる方いらっしゃいましたらご教授をお願いしたいです。




95 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 12:57:44 ]
InvokeScript

96 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 18:18:27 ]
vs2008の3か月フリー版でC#をいじってます。
VC++Ver6ではDefWindowProc を追加するのは仮想関数のオーバーライド
ってところでやってましたが、C#では同様なことをするにはどうすれ
ば追加できますか?

どちら様かご教示のほど、よろしくお願いしますm(__)m

97 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 18:37:32 ]
生のメッセージ捕まえたいのならWndProcをオーバーライド

98 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 18:56:54 ]
>>97
早速の回答、ありがとうございます。
開発環境の使い方がいまいちわからないのですが、
オーバーライドするときは対象の関数を自分でタイプするような
かたちなのでしょうか?それともどこかのメニューから追加でき
るのでしょうか。
申し訳ありませんが、よろしくお願いします。

99 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 19:02:54 ]
クラススコープでいきなり override スペースって打ってみな。一覧がでてくるから。
選らんでエンターでメソッド雛形出来る

100 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 20:46:10 ]
>>99
実装できました。
どうもありがとうございましたm(__)m。

101 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 23:10:36 ]
VS2008で書いたプログラムで蛍光表示管に画像表示させて遊んでいます。

C#のSerialPortクラスにあるWriteメソッドを使って
蛍光表示管にデータ送信をしているのですが
送信途中でブルースクリーンが表示されてWindowsが落ちてしまうことがあります。

一度のデータ送信で300bytes弱、
それを延々と繰り返すようなプログラムを書いています。
そのループ中に、Windowsが落ちることがある、という状態です。

なぜブルースクリーンが出るのか、
どうすれば、ブルースクリーンが出なくなるか、が分かりません。
教えて下さい!

102 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 23:20:32 ]
ブルースクリーンの内容も書かずに質問とな
大体、複数のPCで試したのか?落ちるコードは?ふざけてんの?

103 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 23:21:10 ]
むしろSerialPortクラスでOSが落ちるってどんなコードかいてるのかこっちが聞きたいよ。
っていうか、だからとりあえずチミの環境でその現象が起こる最小のコードを晒そうよ。

104 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 23:54:22 ]
ハード的な問題とか?
その辺素人なんでよく分からんけど。異常な電圧がかかってるとか?



105 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 23:59:25 ]
ブルースクリーンってハードかドライバだろ

106 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 02:48:34 ]
>>105
十中八九そうだろうね

ただ、「デバイス、ドライバ、etc.が異常である」とOSが判断した結果なわけだから
ソフトウェア的な要因も無きにしも非ず。2000/XPならほぼ無いと思うけど

107 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 03:43:51 ]
ブルースクリーンのエラーの内容を書くのが先じゃね

108 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 04:57:10 ]
あれ一瞬で消えること多いのに、MSのサポートにはエラー番号のページを参照してくださいとか書いてあるよね。

109 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 05:42:36 ]
んでエラー番号検索かけてみたら見つからないと・・・

110 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 06:51:11 ]
>>108
システムプロパティの[詳細設定]の[起動と回復]の
[自動的に再起動する]にチェックが入ってるからだろ。

大抵のエンドユーザーはブルースクリーン出たら再起動するだけで、
内容見てもわけわかんないんだから
Microsoftは親切にデフォルトで[自動的に再起動する]にチェックが入ってる。

111 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 16:37:59 ]
それすらも知らないって事はそれすらもしてないって事か

112 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 16:44:37 ]
string[] arg = new string[3] { "a", "b", "c" };
string value = "";
arg.Where(((s ,i) => { value += s + i.ToString() ; return false; })).Count();
Console.Write(value);


こういうことってやっておkですか?

113 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 17:05:36 ]
きもちわるいです

114 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 17:11:24 ]
string用のSum書けば?



115 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 18:44:14 ]
ラムダ式は書き方によってうんこになりすぎるな。

116 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 19:10:55 ]
class newobj
{
public object o { get; private set; }
public newobj(object o)
{
this.o = o;
}
}
例えばこんなクラスがあったとして
object[] arg = new object[3] {1,2,3};
newobj[] list = new newobj[arg.Count()];
arg.Where((obj, i) => { list[i] = new newobj(obj); return false; }).Count();
こんなことできたら便利だなと思いましたが確かにキモイですね。
素直にfor文使います

117 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 19:12:46 ]
せめて、int i を引数に取る Aggregate 書くとかした方が。

118 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 19:27:19 ]
Array.ConvertAllだろどう考えても
せいぜいSelect

119 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 19:37:01 ]
なんだこの Where, return false, Count 厨は

120 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 19:41:32 ]
俺なら

>>112
var arg = new [] { "a", "b", "c" };
var value = arg.Aggregate(new StringBuilder(), (b, i) => b.Append(i));
Console.WriteLine(value.ToString());

>>116
var arg = new [] { 1, 2, 3 };
var list = arg.Select(i => new newobj(i)).ToArray();

と書くな。
副作用を目的としたWhereなんて嫌すぎる。

121 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 19:55:47 ]
newobj[] list = Array.ConvertAll<object, newobj>(arg, (obj) => new newobj(obj));
こういったメソッドも用意されていたのですね。
SQL?の知識が無いためSelectの使い方がよく解らなかったのですがそういう風に使えるんですね。
Aggregateはヘルプ見たのですがいまいち使い方わからなっかのですが便利そうですね。様々な使い方できそうです。
皆様どうもありがとうございました。

122 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 20:00:10 ]
>>120
112の方、仕様満たせてないぞ

123 名前:101 mailto:sage [2008/05/06(火) 21:11:59 ]
>>102-111
レスありがとうございます。

>>110の設定は知りませんでした…ありがとうございます。
・ブルースクリーンのエラー内容を見たところ、以下の通りでした。

STOP: 0x000000D1 (0x00000000, 0x00000002, 0x00000000, 0xBABC9185)
vrcomIT2k.sys Address BABC9185 base at BABC8000, DateStamp 3ec3702e
www.uploda.org/uporg1408089.jpg.html

(FYI:
>>106「デバイス、ドライバ、etc.が異常である」ということで思い出したのが、
PCのUSB端子から、蛍光表示管メーカーが用意している仮想COMドライバを使って
蛍光表示管にデータ送信している、ということをやっています。
もしかしたら本件と関係があるかもしれないので、書いておきます。)

他PCでの再現性については、PCを1台しか持っておらず、
申し訳ないのですがすぐ確認できる状況にはありません。

最小のコードについては、現在調査中です。再現ができ次第、UPしたいと思います。

124 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 21:41:38 ]
> 蛍光表示管メーカーが用意している仮想COMドライバ

臭いな。というかたぶんこれだろう。



125 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 22:50:39 ]
>>123
エラー内容みるかぎり、蛍光管メーカーに問い合わせるのが正解かと
ここで聞いても、運よく同じメーカー同じドライバで同じトラブルに見舞われている人以外には分からないかと。
とりあえずは、ドライバがそのOSに対応しているのか、そのへんから全部チェックしてみたらどうだ?
2kとかついてるから、Windows2000専用とかそういうのないか?

126 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 00:06:52 ]
STOP: 0x000000D1 は、メモリエラーの可能性も無きにしもあらずだから、
念のためmemtest86かけてみたら?まあ、そのエラーでブルースクリーンは
シリアル周り(ハードウェアモデムとか)のエラーとしてすっごくありふれた
ものだから、たぶんドライバの問題だろうね。

127 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 18:53:43 ]
VS2008は起動してるだけでメモリアクセスしてるから
たまに起動してるだけでブルスク(0x9C)になることがあるぜ。
まあ原因は安物メモリのせいかもしれないが。

128 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 21:46:29 ]
それがみんな出ていたらFAQに入るわ

129 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 21:59:12 ]
あきらかにハードが原因だろ

130 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 13:50:15 ]
>VS2008は起動してるだけでメモリアクセスしてるから
そりゃそうだろ。
メモリアクセスしないアプリがあったら見てみたい物だ。


131 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 21:42:28 ]
>>130


132 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 21:47:01 ]
>>131


133 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 21:50:47 ]
>>132

134 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 22:08:25 ]
>>133




135 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 22:20:16 ]
>>134

136 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 22:25:29 ]
>>135


137 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 23:13:00 ]
>>137

138 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 23:43:39 ]
>>139

139 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 06:10:53 ]
>>139

140 名前:130 mailto:sage [2008/05/09(金) 12:01:02 ]
あれ?なんか変なこと言った?

141 名前:デフォルトの名無しさん [2008/05/09(金) 12:17:29 ]
ArrayList arrayをDataGridViewに表示させたいのですが、DataSource=arrayとやっても何も出ません。
何か良い方法はありませんでしょうか?

142 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 12:19:48 ]
>>140

143 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 13:03:35 ]
>>142


144 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 13:06:51 ]
>>141
System.Collections.ArrayList array = new System.Collections.ArrayList();
array.Add(new { X = 3, Y = 4 });
array.Add(new { X = 5, Y = 6 });
this.dataGridView1.DataSource = array;
動作します、原因はArrayListに追加した要素が、プロパティーではなくフィールドになっていたとか、そんなオチでは?




145 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 21:58:27 ]
arrayが空っぽ

146 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 22:10:19 ]
そろそろ麻雀やろうか

147 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 00:22:23 ]
readonly(private setじゃなくてコンストラクタ以外で変更できないようにする方ね)にするためだけに
自動プロパティを使うのを諦めてフィールドを手書きするのが悔しい

148 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 06:34:59 ]
public struct T_INFO_DATA
{
public uint Id;
public uint Fixed;
public byte[] Array;
};

switch (WParam.ToInt32()){
case 0x1200:
COPYDATASTRUCT cds = (COPYDATASTRUCT)Marshal.PtrToStructure(LParam, typeof(COPYDATASTRUCT));
T_INFO_DATA a = (T_INFO_DATA)Marshal.PtrToStructure(cds.lpData, typeof(T_INFO_DATA)); ←ここでエラー



WM_COPYDATA受信時に上記のような処理を行うと下記のエラーメッセージが出ます。

保護されているメモリに読み込みまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。

誰かどのように修正すれば直るのか教えてください。
構造体Arrayの中に入ってる配列数は48個です。
これ以外の構造体(配列を使っていない構造体)の受信は正常に取得できます。よろしくおねがいします。


149 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 07:55:28 ]
良くわかんないけど
C側のイメージとしては
struct T_INFO_DATA
{
DWORD Id;
DWORD Fixed;
BYTE * Array;
}
となっているわけですが、問題ないのですか?

150 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 07:59:51 ]
>>149
+アルルファ
byte [] Array の位置にはポインタが入っているわけでなく、メモリーブロックへのハンドルが入っています。
byte [] オブジェクトを確保して、そこに格納する必要があるのではとか?
ぱっとみ思いつく限り

151 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 09:48:21 ]
やったことはないけども、
int とか IntPtr にして MarshalAs でなんとかできないかな。

152 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 09:55:02 ]
なぜか Word .doc だけど、↓なんてどうだろう。
download.microsoft.com/download/4/f/d/4fd49a94-8772-4bd0-88ca-bf46e2d029fc/WHITEPAPERS/Accessing%20the%20eID%20Middleware%20from%20.NET%20(Version%201.0).doc

153 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 12:07:22 ]
メモリハンドルをIntPtrで受け取っておいて、LocalLock、Marshal.Copy、かな。
あと、Arrayというメンバは名前をhMemとかに変えろ。

154 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 13:16:46 ]
>hMem
むしろキモイ



155 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 13:23:41 ]
そうか?
すぐAPIに渡すものなら、APIの引数名に合わせた方がわかりやすいだろ?

156 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 13:34:18 ]
C#を一から始める際に参考になるサイトとか教えてもらえませんか?

157 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 13:38:40 ]
ケースバイケースだろうね。
Win32APIはともかく、デバイス屋が提供している制御用のAPIなんて
意味不明すぎる命名がされてること多いし。

158 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 13:45:03 ]
>>156
「C# 入門」でぐぐって一番上。

159 名前:148 mailto:sage [2008/05/11(日) 17:40:01 ]
>>149
C側のイメージだと、
struct T_INFO_DATA
{
DWORD Id;
DWORD Fixed;
BYTE Array[48];
}

という認識です。
ポインタを送るほうがいいのでしょうか?

160 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 19:23:15 ]
>>159
構造体メンバの固定長配列は、
unsafe 限定で fixed って構文がある。

ufcpp.net/study/csharp/sp_unsafe.html#fixed

161 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 13:42:03 ]
属性使っていろいろする必要がある。
[StructLayout(LayoutKind.Sequential)]
public struct T_INFO_DATA { 
 public uint Id;
 public uint Fixed;
 [MarshalAs(UnmanagedType.ByValArray, SizeConst=48)]
 public byte[] Array;
};
なお、コンパイルは通してないからこのままでOKかどうかの保証はない。
あとは調べてくれ。


162 名前:148 mailto:sage [2008/05/13(火) 07:16:56 ]
>>161
ありがとうございます。
構造体をその記述にするだけでうまくいきました。

163 名前:デフォルトの名無しさん [2008/05/13(火) 15:55:00 ]
相談内容
RS232C通信のプログラムを作っているのですが、
デバックの効率化のために実際の通信内容を別Windownにてモニタリング
できないか検討してます。

本当はStreamにフックするだけで使えるものが他のデバックにも使えて
望ましいのですが、そんな便利なクラスってないれすか?


164 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 16:02:31 ]
.Net には、フックの類はないよ
自分がやるとしたら、Streamクラスから派生したクラスにフックコードを挿入したアダプタクラスを作って
RS232C通信をアプリ側でフックする
引き続いてWCFを使ってプロセス間通信ができるように、サービスを作って
別ウインドウで作ったデバッグウインドウは、そのサービスに接続して、状況を読み取るといった形式にすると思う。
ついでに、通信情報以外の各種情報もモニターできるようにするかな。



165 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 16:09:14 ]
昔、まさにそういうツールがフリーであって重宝したなあ。
NTで動いてたから、今でも使えるとは思うが何って言ったっけな。

166 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 16:12:25 ]
便利とは思うが、盗聴まがいのAPIはよろしくないから無くした方がいいと思う。
キーボードフックを筆頭に。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<244KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef