事情是这样的,有一台海康威视的摄像头,客户需要一个ActiveX控件嵌入到网页中,通过点击按钮开始录制和结束录制来进行视频的录制和保存,关于海康摄像头的二次开发在此就不多说了,可以参考SDK中的说明。

  直接上流程:

  1.开发环境:

    VS2010,这个打包方便,之前用VS2013打包的,总是调用不了,不知道原因是什么;SDK是32位的,用64位的在Winform中可以正常使用,在网页中使用控件时会报错。

  2.新建项目:

    新建一个类库项目,如下:

    右键点击项目,添加“用户控件”,如下:

    界面拖控件,如下:

    控件代码如下,其中Guid是“工具”->“创建GUID”自动生成的,#region->#endregion折叠部分是实现的IObjectSafety接口

using System;

namespace VideoHelper
{
[System.Security.SecuritySafeCritical]
public class Videos
{
private bool m_initSDK = false;
/// <summary>
/// 正在录制
/// </summary>
private bool m_Record = false;
private uint LastErr = 0;
private Int32 m_RealHandle = -1;
private Int32 m_lUserID = -1;
public IntPtr handle { get; set; }
public bool Initialize(string ip = "192.168.1.64", int port = 8000, string username = "admin", string password = "8910jqk#")
{
try
{
m_initSDK = CHCNetSDK.NET_DVR_Init();
if (m_initSDK)
{
CHCNetSDK.NET_DVR_SetLogToFile(3, "C:\\SdkLog\\", true);
//设备参数结构体
CHCNetSDK.NET_DVR_DEVICEINFO_V30 DeviceInfo = new CHCNetSDK.NET_DVR_DEVICEINFO_V30();
//注册设备
m_lUserID = CHCNetSDK.NET_DVR_Login_V30(ip, port, username, password, ref DeviceInfo);
return m_lUserID >= 0;
}
return false;
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show("Initialize:" + ex.Message);
return false;
}
} public bool Start(IntPtr handle, string filename)
{
try
{
CHCNetSDK.NET_DVR_PREVIEWINFO lpPreviewInfo = new CHCNetSDK.NET_DVR_PREVIEWINFO();
lpPreviewInfo.lChannel = 1;
lpPreviewInfo.dwLinkMode = 0;
lpPreviewInfo.dwStreamType = 0;
lpPreviewInfo.bBlocked = true;
lpPreviewInfo.dwDisplayBufNum = 15;
lpPreviewInfo.hPlayWnd = handle;
IntPtr pUser = IntPtr.Zero;//new IntPtr();
//获取实时视频流
m_RealHandle = CHCNetSDK.NET_DVR_RealPlay_V40(m_lUserID, ref lpPreviewInfo, null, pUser);
if (m_Record == false)
{
CHCNetSDK.NET_DVR_MakeKeyFrame(m_lUserID, 1);
if (!CHCNetSDK.NET_DVR_SaveRealData(m_RealHandle, filename))
{
LastErr = CHCNetSDK.NET_DVR_GetLastError();
return false;
}
else
{
m_Record = true;
return true;
}
}
else
{
return false;
}
}
catch
{
return false;
}
} public bool End()
{
if (m_Record)
{
if (!CHCNetSDK.NET_DVR_StopSaveRealData(m_RealHandle))
{
LastErr = CHCNetSDK.NET_DVR_GetLastError();
return false;
}
m_Record = false;
m_RealHandle = -1;
return true;
}
else
{
return false;
}
} public void Dispose()
{
try
{
if (m_lUserID >= 0)
{
CHCNetSDK.NET_DVR_Logout_V30(m_lUserID);
m_lUserID = -1;
} if (m_RealHandle >= 0)
{
CHCNetSDK.NET_DVR_StopRealPlay(m_RealHandle);
m_RealHandle = -1;
} CHCNetSDK.NET_DVR_Cleanup();
}
catch
{ }
}
}
}
using System;
using System.Runtime.InteropServices; namespace VideoHelper
{
[ComImport, GuidAttribute("CB5BDC81-93C1-11CF-8F20-00805F2CD064")]
[InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
public interface IObjectSafety
{
[PreserveSig]
int GetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] ref int pdwSupportedOptions, [MarshalAs(UnmanagedType.U4)] ref int pdwEnabledOptions); [PreserveSig()]
int SetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] int dwOptionSetMask, [MarshalAs(UnmanagedType.U4)] int dwEnabledOptions);
}
}
using System;
using System.Windows.Forms;
using System.IO;
using System.Runtime.InteropServices;
namespace VideoHelper
{
[System.Security.SecuritySafeCritical]
[Guid("79629620-3C0C-4D47-B93B-2D36AEF8EF31")]
public partial class VideoControl : UserControl,IObjectSafety
{
public VideoControl()
{
InitializeComponent();
}
string videopath = Environment.CurrentDirectory;
Videos video;
IntPtr handle;
private void btnLogin_Click(object sender, EventArgs e)
{
if (btnLogin.Text == "登录")
{
try
{
if (string.IsNullOrWhiteSpace(this.txtIP.Text))
{
MessageBox.Show("IP地址不能为空!");
return;
}
if (string.IsNullOrWhiteSpace(this.txtUserID.Text))
{
MessageBox.Show("用户名不能为空!");
return;
}
if (string.IsNullOrWhiteSpace(this.txtPwd.Text))
{
MessageBox.Show("密码不能为空!");
return;
}
video = new Videos();
if (video.Initialize(this.txtIP.Text, Convert.ToInt32(this.numericUpDown1.Value), this.txtUserID.Text, this.txtPwd.Text))
{
this.btnLogin.Text = "注销";
MessageBox.Show("登录成功!");
this.btnStart.Enabled = true;
this.btnSave.Enabled = true;
}
else
{
MessageBox.Show("登录失败!");
}
}
catch (Exception ee)
{
MessageBox.Show("登录异常:" + ee.Message);
}
}
else if (btnLogin.Text == "注销")
{
try
{
video.Dispose();
this.btnLogin.Text = "登录";
this.btnStart.Enabled = false;
this.btnSave.Enabled = false;
}
catch (Exception ee)
{
MessageBox.Show("注销异常:" + ee.Message);
}
}
} private void btnStart_Click(object sender, EventArgs e)
{
try
{
string filename = txtFile.Text.Trim();
if (filename.IndexOfAny(Path.GetInvalidFileNameChars()) >= 0 || string.IsNullOrWhiteSpace(filename))
{
MessageBox.Show("文件名含有非法字符或空格,请重新输入");
txtFile.Focus();
return;
}
video.Start(handle, filename + comboBox1.SelectedItem.ToString());
this.btnStart.Enabled = false;
this.btnSave.Enabled = true;
}
catch (Exception ee)
{
MessageBox.Show("异常:" + ee.Message);
}
} private void btnSave_Click(object sender, EventArgs e)
{
try
{
if (video.End())
{
MessageBox.Show("视频已保存!");
this.btnStart.Enabled = true;
this.btnSave.Enabled = false;
}
else
{
MessageBox.Show("保存失败!");
this.btnStart.Enabled = true;
this.btnSave.Enabled = true;
}
}
catch (Exception ee)
{ MessageBox.Show("异常:" + ee.Message); }
} private void button1_Click(object sender, EventArgs e)
{
try
{
System.Diagnostics.Process.Start(videopath); }
catch
{ }
} private void VideoControl_Load(object sender, EventArgs e)
{
this.comboBox1.SelectedItem = ".mp4";
this.handle = pictureBox1.Handle;
this.btnStart.Enabled = false;
this.btnSave.Enabled = false;
} #region IObjectSafety 成员
private const string _IID_IDispatch = "{00020400-0000-0000-C000-000000000046}";
private const string _IID_IDispatchEx = "{a6ef9860-c720-11d0-9337-00a0c90dcaa9}";
private const string _IID_IPersistStorage = "{0000010A-0000-0000-C000-000000000046}";
private const string _IID_IPersistStream = "{00000109-0000-0000-C000-000000000046}";
private const string _IID_IPersistPropertyBag = "{37D84F60-42CB-11CE-8135-00AA004BB851}"; private const int INTERFACESAFE_FOR_UNTRUSTED_CALLER = 0x00000001;
private const int INTERFACESAFE_FOR_UNTRUSTED_DATA = 0x00000002;
private const int S_OK = 0;
private const int E_FAIL = unchecked((int)0x80004005);
private const int E_NOINTERFACE = unchecked((int)0x80004002); private bool _fSafeForScripting = true;
private bool _fSafeForInitializing = true; public int GetInterfaceSafetyOptions(ref Guid riid, ref int pdwSupportedOptions, ref int pdwEnabledOptions)
{
int Rslt = E_FAIL; string strGUID = riid.ToString("B");
pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA;
switch (strGUID)
{
case _IID_IDispatch:
case _IID_IDispatchEx:
Rslt = S_OK;
pdwEnabledOptions = 0;
if (_fSafeForScripting == true)
pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER;
break;
case _IID_IPersistStorage:
case _IID_IPersistStream:
case _IID_IPersistPropertyBag:
Rslt = S_OK;
pdwEnabledOptions = 0;
if (_fSafeForInitializing == true)
pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA;
break;
default:
Rslt = E_NOINTERFACE;
break;
} return Rslt;
} public int SetInterfaceSafetyOptions(ref Guid riid, int dwOptionSetMask, int dwEnabledOptions)
{
int Rslt = E_FAIL;
string strGUID = riid.ToString("B");
switch (strGUID)
{
case _IID_IDispatch:
case _IID_IDispatchEx:
if (((dwEnabledOptions & dwOptionSetMask) == INTERFACESAFE_FOR_UNTRUSTED_CALLER) && (_fSafeForScripting == true))
Rslt = S_OK;
break;
case _IID_IPersistStorage:
case _IID_IPersistStream:
case _IID_IPersistPropertyBag:
if (((dwEnabledOptions & dwOptionSetMask) == INTERFACESAFE_FOR_UNTRUSTED_DATA) && (_fSafeForInitializing == true))
Rslt = S_OK;
break;
default:
Rslt = E_NOINTERFACE;
break;
} return Rslt;
} #endregion
}
}
namespace VideoHelper
{
partial class VideoControl
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.IContainer components = null; /// <summary>
/// 清理所有正在使用的资源。
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
} #region 组件设计器生成的代码 /// <summary>
/// 设计器支持所需的方法 - 不要
/// 使用代码编辑器修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.button1 = new System.Windows.Forms.Button();
this.comboBox1 = new System.Windows.Forms.ComboBox();
this.label4 = new System.Windows.Forms.Label();
this.txtFile = new System.Windows.Forms.TextBox();
this.btnSave = new System.Windows.Forms.Button();
this.btnStart = new System.Windows.Forms.Button();
this.btnLogin = new System.Windows.Forms.Button();
this.label3 = new System.Windows.Forms.Label();
this.txtPwd = new System.Windows.Forms.TextBox();
this.label2 = new System.Windows.Forms.Label();
this.txtUserID = new System.Windows.Forms.TextBox();
this.label1 = new System.Windows.Forms.Label();
this.numericUpDown1 = new System.Windows.Forms.NumericUpDown();
this.IP = new System.Windows.Forms.Label();
this.txtIP = new System.Windows.Forms.TextBox();
this.pictureBox1 = new System.Windows.Forms.PictureBox();
((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
this.SuspendLayout();
//
// button1
//
this.button1.Cursor = System.Windows.Forms.Cursors.Hand;
this.button1.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.button1.Location = new System.Drawing.Point(377, 360);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(138, 22);
this.button1.TabIndex = 58;
this.button1.Text = "打开视频存放位置";
this.button1.UseVisualStyleBackColor = true;
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// comboBox1
//
this.comboBox1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.comboBox1.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.comboBox1.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.comboBox1.FormattingEnabled = true;
this.comboBox1.Items.AddRange(new object[] {
".mp4",
".avi",
".wmv",
".3gp",
".flv"});
this.comboBox1.Location = new System.Drawing.Point(303, 361);
this.comboBox1.Name = "comboBox1";
this.comboBox1.Size = new System.Drawing.Size(55, 25);
this.comboBox1.TabIndex = 57;
//
// label4
//
this.label4.AutoSize = true;
this.label4.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.label4.Location = new System.Drawing.Point(14, 360);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(116, 17);
this.label4.TabIndex = 56;
this.label4.Text = "请输入视频文件名:";
//
// txtFile
//
this.txtFile.Location = new System.Drawing.Point(136, 360);
this.txtFile.Name = "txtFile";
this.txtFile.Size = new System.Drawing.Size(161, 21);
this.txtFile.TabIndex = 55;
//
// btnSave
//
this.btnSave.Cursor = System.Windows.Forms.Cursors.Hand;
this.btnSave.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.btnSave.Location = new System.Drawing.Point(490, 298);
this.btnSave.Name = "btnSave";
this.btnSave.Size = new System.Drawing.Size(57, 45);
this.btnSave.TabIndex = 54;
this.btnSave.Text = "保存";
this.btnSave.UseVisualStyleBackColor = true;
this.btnSave.Click += new System.EventHandler(this.btnSave_Click);
//
// btnStart
//
this.btnStart.Cursor = System.Windows.Forms.Cursors.Hand;
this.btnStart.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.btnStart.Location = new System.Drawing.Point(421, 298);
this.btnStart.Name = "btnStart";
this.btnStart.Size = new System.Drawing.Size(57, 45);
this.btnStart.TabIndex = 53;
this.btnStart.Text = "录制";
this.btnStart.UseVisualStyleBackColor = true;
this.btnStart.Click += new System.EventHandler(this.btnStart_Click);
//
// btnLogin
//
this.btnLogin.Cursor = System.Windows.Forms.Cursors.Hand;
this.btnLogin.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.btnLogin.Location = new System.Drawing.Point(352, 298);
this.btnLogin.Name = "btnLogin";
this.btnLogin.Size = new System.Drawing.Size(57, 45);
this.btnLogin.TabIndex = 52;
this.btnLogin.Text = "登录";
this.btnLogin.UseVisualStyleBackColor = true;
this.btnLogin.Click += new System.EventHandler(this.btnLogin_Click);
//
// label3
//
this.label3.AutoSize = true;
this.label3.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.label3.Location = new System.Drawing.Point(172, 325);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(44, 17);
this.label3.TabIndex = 51;
this.label3.Text = "密码:";
//
// txtPwd
//
this.txtPwd.Location = new System.Drawing.Point(221, 322);
this.txtPwd.Name = "txtPwd";
this.txtPwd.PasswordChar = '*';
this.txtPwd.Size = new System.Drawing.Size(115, 21);
this.txtPwd.TabIndex = 50;
this.txtPwd.Text = "8910jqk#";
this.txtPwd.UseSystemPasswordChar = true;
//
// label2
//
this.label2.AutoSize = true;
this.label2.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.label2.Location = new System.Drawing.Point(8, 322);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(44, 17);
this.label2.TabIndex = 49;
this.label2.Text = "用户名";
//
// txtUserID
//
this.txtUserID.Location = new System.Drawing.Point(66, 322);
this.txtUserID.Name = "txtUserID";
this.txtUserID.Size = new System.Drawing.Size(100, 21);
this.txtUserID.TabIndex = 48;
this.txtUserID.Text = "admin";
//
// label1
//
this.label1.AutoSize = true;
this.label1.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.label1.Location = new System.Drawing.Point(172, 295);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(44, 17);
this.label1.TabIndex = 47;
this.label1.Text = "端口:";
//
// numericUpDown1
//
this.numericUpDown1.Location = new System.Drawing.Point(222, 295);
this.numericUpDown1.Maximum = new decimal(new int[] {
65535,
0,
0,
0});
this.numericUpDown1.Minimum = new decimal(new int[] {
1,
0,
0,
0});
this.numericUpDown1.Name = "numericUpDown1";
this.numericUpDown1.Size = new System.Drawing.Size(114, 21);
this.numericUpDown1.TabIndex = 46;
this.numericUpDown1.Value = new decimal(new int[] {
8000,
0,
0,
0});
//
// IP
//
this.IP.AutoSize = true;
this.IP.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.IP.Location = new System.Drawing.Point(20, 295);
this.IP.Name = "IP";
this.IP.Size = new System.Drawing.Size(19, 17);
this.IP.TabIndex = 45;
this.IP.Text = "IP";
//
// txtIP
//
this.txtIP.Location = new System.Drawing.Point(66, 295);
this.txtIP.Name = "txtIP";
this.txtIP.Size = new System.Drawing.Size(100, 21);
this.txtIP.TabIndex = 44;
this.txtIP.Text = "192.168.1.64";
//
// pictureBox1
//
this.pictureBox1.Location = new System.Drawing.Point(5, 5);
this.pictureBox1.Name = "pictureBox1";
this.pictureBox1.Size = new System.Drawing.Size(542, 269);
this.pictureBox1.TabIndex = 43;
this.pictureBox1.TabStop = false;
//
// VideoControl
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.button1);
this.Controls.Add(this.comboBox1);
this.Controls.Add(this.label4);
this.Controls.Add(this.txtFile);
this.Controls.Add(this.btnSave);
this.Controls.Add(this.btnStart);
this.Controls.Add(this.btnLogin);
this.Controls.Add(this.label3);
this.Controls.Add(this.txtPwd);
this.Controls.Add(this.label2);
this.Controls.Add(this.txtUserID);
this.Controls.Add(this.label1);
this.Controls.Add(this.numericUpDown1);
this.Controls.Add(this.IP);
this.Controls.Add(this.txtIP);
this.Controls.Add(this.pictureBox1);
this.Name = "VideoControl";
this.Size = new System.Drawing.Size(556, 398);
this.Load += new System.EventHandler(this.VideoControl_Load);
((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
this.ResumeLayout(false);
this.PerformLayout(); } #endregion private System.Windows.Forms.Button button1;
private System.Windows.Forms.ComboBox comboBox1;
private System.Windows.Forms.Label label4;
private System.Windows.Forms.TextBox txtFile;
private System.Windows.Forms.Button btnSave;
private System.Windows.Forms.Button btnStart;
private System.Windows.Forms.Button btnLogin;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.TextBox txtPwd;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.TextBox txtUserID;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.NumericUpDown numericUpDown1;
private System.Windows.Forms.Label IP;
private System.Windows.Forms.TextBox txtIP;
private System.Windows.Forms.PictureBox pictureBox1;
}
}

    至此,此项目结束。

    右键点击解决方案,添加新项目,如下,至于为什么建立两个项目,我一会儿在下面解释,

    在HkHelper项目中添加类CHCNetSDK.cs,此类是海康提供的,可以在官网找到

    接下来,最重要的,项目属性设置如下,两个项目都要设置:

    至此,自定义控件已经完成,接下来就是打包,新建一个安装项目:

    右键点击安装项目,“添加”->“项目输出”,并选择自定义控件的项目,然后确定

    然后添加海康提供的SDK的库文件文件夹下的所有文件和文件夹到项目中,如下:

    然后生成项目,会生成setup.exe和SetupVideo.msi两个文件,然后用打包文件,把这两个文件打包称cab文件就OK了

打包文件一共三个cabarc.exe、build.bat、install.inf

build.bat文件:

"cabarc.exe"  n VideoSetup.cab SetupVideo.msi install.inf

install.inf文件:

[version]
signature="$CHICAGO$"
AdvancedINF=2.0 [Setup Hooks]
hook1=hook1 [hook1]
run=msiexec.exe /i "%EXTRACT_DIR%\SetupVideo.msi" /qn

cabarc.exe是微软提供的工具

最后说一下为什么要分为两个项目去实现控件,那是因为如果在一个项目中的话,调用海康动态库的类CHCNetSDK.cs不能进行COM注册

C#制作ActiveX控件中调用海康SDK的问题的更多相关文章

  1. C#制作ActiveX控件及部署升级(摘自网络)

    使用C#开发ActiveX控件 控件开发.制作CAB包.签名.部署 ActiveX控件以前也叫做OLE控件,它是微软IE支持的一种软件组件或对象,可以将其插入到Web页面中,实现在浏览器端执行动态程序 ...

  2. C# 制作ActiveX控件并添加到网页

    1.创建ActiveX控件——按钮 2.定义一个接口,并在控件中实现 3.部署安装 4.CAB打包 5.添加到网页中进行测试 一. 创建ActiveX控件——按钮 1.新建一个Window窗体控件库项 ...

  3. golang调用海康sdk

    git地址:https://gitee.com/mimo431/hcnet-sdk_golang 网络不太流畅,先传gitee上 参考链接: https://www.cnblogs.com/dust9 ...

  4. ActiveX控件资料

    Visual Studio 2008(c#)开发ActiveX控件及制作CAB包总结(1) 分类: C#2011-05-27 15:50 403人阅读 评论(0) 收藏 举报 c#stringhook ...

  5. C#编写ActiveX控件

    用C#编写ActiveX控件 http://www.cnblogs.com/homer/archive/2005/01/04/86473.html http://www.cnblogs.com/hom ...

  6. 用C#编写ActiveX控件

    http://www.cnblogs.com/homer/archive/2005/01/04/86473.html http://www.cnblogs.com/homer/archive/2005 ...

  7. 袁创:使用反射动态调用ActiveX控件

    ■■■■前言 目前的基于.NET平台的软件研发中仍然存在大量的对COM及ActiveX控件的调用.使用C#调用ActiveX控件时一般是使用vs.net工具自动生成的互操作性程序集.这种方法操作简单, ...

  8. 使用反射动态调用ActiveX控件

    使用反射动态调用ActiveX控件 袁永福 2018-3-2 ■■■■问题描述: 目前的基于.NET平台的软件研发中仍然存在大量的对COM及ActiveX控件的调用.使用C#调用ActiveX控件时一 ...

  9. 如何在VS2010中添加ActiveX控件及使用方法

    方法1: 1.首先在在项目上面右击添加类,如下图所示: 2.点击添加ActiveX控件中的MFC类 3.找到需要添加的ActiveX类. 4.点击完成即可. 5.此时转到资源视图,打开如下视图.可能工 ...

随机推荐

  1. 文件夹操作-DirectoryInfo类

    DirectoryInfo类是一个密封类,它可以用来创建.移动.枚举目录和子目录.DirectoryInfo类包括4个属性,可以用来获取目录的名称.父目录等. DirectoryInfo类的属性表 属 ...

  2. 我只能说,Spring Data REST真的很燥辣

    我自己写REST,到一半了,突然想试一下Spring Data REST,还真不是乱说, 燥辣得很,短时间全生成,快赶上DJANGO的速度了.怕了我. 参考文档: Spring Data REST入门 ...

  3. Codeforces 914D Bash and a Tough Math Puzzle (ZKW线段树)

    题目链接  Round #458 (Div. 1 + Div. 2, combined)  Problem D 题意  给定一个序列,两种询问:单点修改,询问某个区间能否通过改变最多一个数使得该区间的 ...

  4. Codeforces 246E - Blood Cousins Return (树上启发式合并)

    246E - Blood Cousins Return 题意 给出一棵家谱树,定义从 u 点向上走 k 步到达的节点为 u 的 k-ancestor,每个节点有名字,名字不唯一.多次查询,给出 u k ...

  5. 洛谷—— P1680 奇怪的分组

    https://www.luogu.org/problemnew/show/1680 题目背景 终于解出了dm同学的难题,dm同学同意帮v神联络.可dm同学有个习惯,就是联络同学的时候喜欢分组联络,而 ...

  6. 【bzoj4403】【序列统计】不降转升+组合数添项合并

    (上不了p站我要死了,侵权度娘背锅) Description 给定三个正整数N.L和R,统计长度在1到N之间,元素大小都在L到R之间的单调不降序列的数量.输出答案对10^6+3取模的结果. Input ...

  7. 数值计算方法 | C语言实现几个数值计算方法(实验报告版)

    目录 写在前面 实验一 牛顿插值方法的实现 实验二 龙贝格求积算法的实现 实验三 高斯列主元消去法的实现 实验四 最小二乘方法的实现 写在前面 使用教材:<数值计算方法>黄云清等编著 科学 ...

  8. 1,java的跨平台原理

    简单讲一下java的跨平台原理: (1)为什么跨平台: 由于各OS支持的指令集各不相同,就需要程序在不同的平台执行不同的代码 (2)JAVA是如何实现的: ava开发了适合不同的OS及不同位数的jav ...

  9. JAVA和.NET工作流相关项目收集

    .NET以自主实现为主, 暂未发现使用WWF框架开发的开源工作流,    java以BPM系为主 . .NET: RoadFlow : http://www.cqroad.cn/ 使用了百度编辑器扩展 ...

  10. 使用 SVG 来实现波浪 (wave) 动画效果

    如下图所示的波浪动画效果,实现方法有很多,比如CSS或者是js等方法都可以实现.不过,要是使用SVG来实现的,我觉得比其它两种方法都要简单.这篇文章就来讲讲使用SVG来实现类似这样的波浪动画效果是多么 ...