A példaalkalmazásban az APIClass osztály metódusaiba burkoltuk az üzenetküldő funkciót. A forrás fájl fejlécében meg kell adnunk néhány hivatkozást, hogy elérjük a szükséges osztályokat:
using System.Runtime.InteropServices;
using System.Net;
using System.Net.Sockets;
Az üzenetküldés a Netapi32.dll állomány NetMessageBufferSend nevű metódusának meghívásával válik lehetővé. Az osztályban deklaráljuk a metódust:
[DllImport("NetApi32")]
public static extern int NetMessageBufferSend(uint ServerName,uint MsgName, uint FromName,uint Buffer,ulong BufferLen);
A függvényt első paraméterében kell megadni a függvényt hívó számítógép nevét, mely általában az a számítógép is, melyet az üzenet forrását reprezentáló harmadik paraméterben megadunk. Az első és a harmadik paraméterben NULL értéket megadva automatikusan a LOCALHOST helyettesítődik be üzenetküldőként.
A függvény második paraméterében adjuk meg a címzett számítógép nevét, vagy IP címét. A negyedik paraméter az üzenetet, az ötödik paraméter az üzenet hosszát tartalmazza.
Ezek ismeretében lássuk, hogyan is hívható meg a függvény.
Az osztály konstruktorában egy változóban eltároljuk a számítógépünk nevét:
public APIClass()
{
localPC = Dns.GetHostName();
}
A függvény meghívása előtt a megadott karakterláncokat először át kell konvertálnunk UInt32 típusúra. Ennek érdekében szükségünk van egy függvényre. Annak érdekében, hogy a konverzió sikeres legyen, nem használhatjuk a Convert.ToUInt32 metódust. Helyette a kapott karakterláncot egy mutatónak adjuk át, mely már implicite átkonvertálható UInt32 típusúra.
unsafe private UInt32 StringToPtr(string str)
{
UInt32 strPtr;
fixed(char* ptr = str)
{
strPtr = (UInt32) ptr;
}
return strPtr;
}
A menedzselt típushoz nem-menedzselt mutató hozzárendelése csak a FIXED kulcsszó használatával lehetséges. A kulcsszó azonban csak az úgynevezett UNSAFE kontextusban használható. Ennek érdekében a metódusunkat az unsafe kulcsszóval kell megjelölni.
Ezt azonban a projekt tulajdonságainál engedélyeznünk kell, mégpedig a Build menüpontban az „Allow unsafe code blocks” értékét TRUE-ra kell állítanunk.
Az üzenet küldését a SendMsg metódusban végezzük el. A metódusban minden paramétert a megfelelő típusúra hozunk:
public int SendMsg(string srvName, string msg)
{
Létrehozunk egy IPHostEntry objektumot a host számítógép címének meghatározásához:
IPHostEntry ip = new IPHostEntry();
Az üzenet hosszát UInt64 formátumban kell megadni:
msgLength = (UInt64) msg.Length * 2;
A helyi számítógép a küldő, így annak nevét adjuk meg a localPtr változóban:
localPtr = StringToPtr(localPC);
Az üzenetre UInt32 formátumban van szükség:
msgPtr = StringToPtr(msg);
A célszámítógép nevét is UInt32 formátumban adjuk meg:
ip = Dns.Resolve(srvName);
toSrvName = ip.HostName;
toPtr = StringToPtr(toSrvName);
Majd meghívjuk a NetMessageBufferSend metódust:
status = NetMessageBufferSend(localPtr,toPtr,localPtr,msgPtr,msgLength);
...
}
Az Elküld gomb megnyomásakor már csak példányosítjuk az APIClass osztályt, és meghívjuk a SendMsg függvényt:
APIClass s = new APIClass();
s.SendMsg(textBox1.Text,textBox2.Text);
...