質問編集履歴
2
微調整
test
CHANGED
File without changes
|
test
CHANGED
@@ -210,8 +210,10 @@
|
|
210
210
|
|
211
211
|
|
212
212
|
|
213
|
-
|
213
|
+
型のmappingみたいなことをコンパイル時にやることは可能か質問したのですが、無理そうですね・・・。
|
214
|
+
|
214
|
-
|
215
|
+
一般的な実装について聞くには情報不足でした。
|
215
|
-
|
216
|
-
|
216
|
+
|
217
|
+
|
218
|
+
|
217
|
-
iwamoto_takaakiさんの提案していただいた方法はかなりトリッキーです
|
219
|
+
iwamoto_takaakiさんの提案していただいた方法はかなりトリッキーとのことですが・・・、私は好きだけどいいんだろうか、こんな設計・・・。
|
1
質問の経緯を追記
test
CHANGED
File without changes
|
test
CHANGED
@@ -115,3 +115,103 @@
|
|
115
115
|
|
116
116
|
|
117
117
|
C#の場合こういうことはできないのでしょうか?
|
118
|
+
|
119
|
+
|
120
|
+
|
121
|
+
---
|
122
|
+
|
123
|
+
|
124
|
+
|
125
|
+
追記
|
126
|
+
|
127
|
+
|
128
|
+
|
129
|
+
状況としてはWin32APIをWrapしようとしています。
|
130
|
+
|
131
|
+
Win32APIの[NetShareEnum](https://msdn.microsoft.com/ja-jp/library/cc446966.aspx)関数は第二引数によって、第三引数から返されるものが変化し、
|
132
|
+
|
133
|
+
第二引数が0, 1, 2, 502の時、それぞれ``SHARE_INFO_0``,``SHARE_INFO_1``,``SHARE_INFO_2``,``SHARE_INFO_502``の4つの構造体のいずれかを指すポインタを返します。
|
134
|
+
|
135
|
+
|
136
|
+
|
137
|
+
とりあえず第二引数に2を指定するものをラップしたのが
|
138
|
+
|
139
|
+
|
140
|
+
|
141
|
+
https://bitbucket.org/yumetodo/netshareenum/src/d2f19f705267259cf3b899cf0bbcbacd9fe71e05/NetShareEnum/Program.cs?at=master&fileviewer=file-view-default
|
142
|
+
|
143
|
+
|
144
|
+
|
145
|
+
です。
|
146
|
+
|
147
|
+
|
148
|
+
|
149
|
+
```csharp
|
150
|
+
|
151
|
+
public static List<SHARE_INFO_2> NetShareEnum_2_wrap(string serverName) {
|
152
|
+
|
153
|
+
var re = new List <SHARE_INFO_2> { };
|
154
|
+
|
155
|
+
Int32 er = 0;
|
156
|
+
|
157
|
+
Int32 tr = 0;
|
158
|
+
|
159
|
+
Int32 resume = 0;
|
160
|
+
|
161
|
+
int res;
|
162
|
+
|
163
|
+
do
|
164
|
+
|
165
|
+
{
|
166
|
+
|
167
|
+
res = NetShareEnum(serverName, 2, out var bufPtr, -1, ref er, ref tr, ref resume);
|
168
|
+
|
169
|
+
if (res != (int)NET_API_STATUS.NERR_Success && res != (int)NET_API_STATUS.ERROR_MORE_DATA) break;
|
170
|
+
|
171
|
+
var infoP = bufPtr;
|
172
|
+
|
173
|
+
for (int i = 0; i < er; ++i)
|
174
|
+
|
175
|
+
{
|
176
|
+
|
177
|
+
re.Add(Marshal.PtrToStructure<SHARE_INFO_2>(infoP));
|
178
|
+
|
179
|
+
infoP = IntPtr.Add(infoP, Marshal.SizeOf<SHARE_INFO_2>());
|
180
|
+
|
181
|
+
}
|
182
|
+
|
183
|
+
NetApiBufferFree(bufPtr);
|
184
|
+
|
185
|
+
} while (res == (int)NET_API_STATUS.ERROR_MORE_DATA);
|
186
|
+
|
187
|
+
return re;
|
188
|
+
|
189
|
+
}
|
190
|
+
|
191
|
+
```
|
192
|
+
|
193
|
+
|
194
|
+
|
195
|
+
これを一般化するために
|
196
|
+
|
197
|
+
|
198
|
+
|
199
|
+
まずはdynamicを使うことを考えましたが、できれば静的にやりたいなと思い却下し
|
200
|
+
|
201
|
+
|
202
|
+
|
203
|
+
空のinterfaceクラスをでっち上げて``SHARE_INFO_x``クラスに指定し、Genericsの制約に使用することも考えましたが、[空のinterfaceクラスは良くない](https://msdn.microsoft.com/ja-jp/library/ms182128.aspx)という記事が見つかり、またマーシャリングと組み合わせられるのかわからず断念し、
|
204
|
+
|
205
|
+
|
206
|
+
|
207
|
+
そこで上述のような静的型mapみたいなことを思いついたわけですが、C#のGenericsだと値は
|
208
|
+
|
209
|
+
渡せなかったのを思い出し、諦め、
|
210
|
+
|
211
|
+
|
212
|
+
|
213
|
+
どういう設計が一般的に考えられるのかと思い質問したのですが、情報不足でした。
|
214
|
+
|
215
|
+
|
216
|
+
|
217
|
+
iwamoto_takaakiさんの提案していただいた方法はかなりトリッキーですね・・・、私は好きだけどいいんだろうか、こんな設計・・・。
|