利用するメリット
.NET から WinAPI を直接使う場合, マーシャルが必要で, さらにプロセス名を得るには 2種類の API関数を呼び出す必要があるし, 呼び出したメンバも, どこでメモリ解放するかについて考える必要があるが
これを使えば マーシャル不要, 1回のインスタンス生成で済む, 解放は Dispose だけでよい。
動作
こんな感じに, netstat を実行した場合にえられる
ローカルIP・ポート、リモートIPポート、プロセスID(PID)
にくわえて、さらに
プロセス名(日本語プロセス名対応)
も含んだ構造体をえることができます。
使用する Lib, DLL 「mynetstat」
マルウェアが怖い方は、 vector からインストールください。
呼び出しコード
VC++, C#, VB.NET から呼び出せる
VC++
TCPCpp* ins;
TCPROW* row = NULL;
ins = new TCPCpp();
row = (*ins).getstat();
for (int i = 0; i < row.size[0]; j++){
cout << row[i].LocalAddr << row[i].LocalPort <<
row[i].RemoteAddr << row[i].RemotePort << row[i].PID;
setlocale(LC_ALL, "japanese"); wcout << row[i].ProcessName;
cout << row[i].Statestr << endl;
}
(*ins).getstat_free(row); //getstat をループ実行させる場合は、これをループ毎に実行
delete ins;
VB.NET
Dim ins As TCPNET
Dim dat As TCPROW_NET()
Dim str As String
ins = New TCPNET
dat = ins.getstat()
For i = 0 To dat(0).size - 1
str = str & dat(i).LocalAddr & " " & dat(i).LocalPort &
" " & dat(i).RemoteAddr & " " & dat(i).RemotePort & " " &_
dat(i).PID & " " & dat(i).ProcessName & " " & dat(i).Statestr & ControlChars.NewLine
Next i
ins.Dispose()
C#
TCPNET ins;
TCPROW_NET[] dat;
ins = new TCPNET();
dat = ins.getstat();
for( int i=0; i <dat[0].size;i++){
str = str + dat[i].LocalAddr+" " + dat[i].LocalPort+" "
+dat[i].RemoteAddr+" " +dat[i].RemotePort+" " +dat[i].PID+
" " +dat[i].ProcessName + " " +
dat[i].Statestr+ "\r\n" ;
}
ins.Dispose();