WebChart Web LANチャットシリーズ(一):ActiveXプラグイン作成
5290 ワード
ステップ1:ActiveXコントロールクラスライブラリを作成し、ソリューションで右クリックしてWindowフォームコントロールライブラリを追加
このクラスライブラリ属性では、セットCOMが表示されるように設定するとともに、COM相互運用登録に設定する
また自動生成ファイルにはAssemblyInfo.cs,[assembly:AllowPartiallyTrustedCallers()を追加]
以上の操作の目的は,他のフレームワークページがそのActiveXにアクセスできるようにする方法である.
ステップ2:フロントインタフェースクラスを追加し、主にwebページに呼び出す
このメソッドを追加すると、Webページからこの2つのメソッドにアクセスできます.
ステップ3:ActiveXトリガインタフェースを追加し、Webページに渡されたイベントをトリガします.
ステップ4:ActiveXクラスライブラリで、フロントインタフェースクラスの実装方法を実現する
ステップ5:Webページ接続及び送信データ受信
フロントスクリプトの作成、コードは次のとおりです.
以上はクライアントの基本構造と主なコードを示しており、次の主な受信サーバ側の主な構造とコード
ソース:WebChart.rar
このクラスライブラリ属性では、セットCOMが表示されるように設定するとともに、COM相互運用登録に設定する
また自動生成ファイルにはAssemblyInfo.cs,[assembly:AllowPartiallyTrustedCallers()を追加]
以上の操作の目的は,他のフレームワークページがそのActiveXにアクセスできるようにする方法である.
ステップ2:フロントインタフェースクラスを追加し、主にwebページに呼び出す
[Guid("806635E5-AFF1-4BBE-960F-121910EB7F7A"),InterfaceType(ComInterfaceType.InterfaceIsDual),ComVisible(true)]
public interface ISendMsg
{
[DispId(1)]
int Conn(string ip,int port);
[DispId(2)]
void Send(string msg);
}
このメソッドを追加すると、Webページからこの2つのメソッドにアクセスできます.
ステップ3:ActiveXトリガインタフェースを追加し、Webページに渡されたイベントをトリガします.
[Guid("D6F88421-BE17-4310-9692-A07A00CDF474"),InterfaceType(ComInterfaceType.InterfaceIsIDispatch),ComVisible(true)]
public interface IMsgEvent
{
[DispId(21)]
void OnMsgHander(string msg);
}
ステップ4:ActiveXクラスライブラリで、フロントインタフェースクラスの実装方法を実現する
[Guid("8366F83A-F207-4B41-ACD1-49A3EBAFE192"), ProgId("Socket_Ocx.UserMain"), ClassInterface(ClassInterfaceType.None), ComDefaultInterface(typeof(ISendMsg)),ComSourceInterfaces(typeof(IMsgEvent)), ComVisible(true)]
public partial class UserMain : UserControl, ISendMsg
{
private Socket client;
public delegate void MsgHander(string msg);
public event MsgHander OnMsgHander;
public UserMain()
{
InitializeComponent();
}
/// <summary>
/// WEB ,
/// </summary>
/// <param name="ip"></param>
/// <param name="port"></param>
/// <returns></returns>
public int Conn(string ip, int port)
{
int result = 0;
IPEndPoint iep = new IPEndPoint(IPAddress.Parse(ip),port);
client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
client.Connect(iep);
result = 1;
Thread nowThread = new Thread(new ThreadStart(ReciveData));
nowThread.Start();
}
catch
{
result = 0;
}
return result;
}
// WEB
public void Send(string msg)
{
try
{
byte[] data = Encoding.UTF8.GetBytes(msg);
client.Send(data);
}
catch (Exception ex)
{
}
}
/// <summary>
/// WEB
/// </summary>
private void ReciveData()
{
int res;
while (true)
{
try
{
byte[] bytes = new byte[1024];
res = client.Receive(bytes);
string msg = Encoding.UTF8.GetString(bytes, 0, res);
OnMsgHander(msg);
}
catch (Exception ex)
{
}
}
}
}
ステップ5:Webページ接続及び送信データ受信
<object id="ocx" classid="clsid:8366F83A-F207-4B41-ACD1-49A3EBAFE192">
</object>
フロントスクリプトの作成、コードは次のとおりです.
<script for="ocx" language="JavaScript" event="OnMsgHander(s)">
if(document.getElementById("txtAllMsg").value == ""){
document.getElementById("txtAllMsg").value = s;
}
else{
document.getElementById("txtAllMsg").value += "\r
"+ s;
}
</script>
<script type="text/javascript">
function onLogin(){
var user = document.getElementById("txtUserName").value;
var pswd = document.getElementById("txtPswd").value;
if(user==""||pswd==""){
alert(" !");
return;
}
document.getElementById("divMax").style.display="none";
document.getElementById("txtUser").value = user;
document.getElementById("spanUser").innerHTML = user;
init();
}
function init(){
var res = ocx.Conn('127.0.0.1',2000);
}
function onSend(){
var msg = document.getElementById("txtSendMsg").value;
if(msg==""){
alert(" !");
return;
}
var user = document.getElementById("txtUser").value;
ocx.Send(user+":"+msg);
if(document.getElementById("txtAllMsg").value == ""){
document.getElementById("txtAllMsg").value = user+":"+msg;
}
else{
document.getElementById("txtAllMsg").value += "\r
"+ user+":"+msg;
}
document.getElementById("txtSendMsg").value ="";
}
</script>
以上はクライアントの基本構造と主なコードを示しており、次の主な受信サーバ側の主な構造とコード
ソース:WebChart.rar