VS2012.C#开发ActiveX组件流程以及注意事项v1.0
- 格式:docx
- 大小:2.50 MB
- 文档页数:22
Win7下如何用VS2012配置opencv3.0.0一、下载在opencv官网:/下载OpenCV for Windows,opencv3.0.0版本。
二、解压下载完后得到文件OpenCV3.0.0,双击可以解压到到D盘根目录,然后点击Extract按钮,解压出了一个大小为2.59GB的opencv文件夹,其下有build和sources两个文件夹。
三、环境变量配置在桌面上右击“计算机”属性—高级系统设置—环境变量,在系统变量上点击“新建”变量名填写PATH变量值填写D:\opencv\build\x86\vc11\bin注意:上面vc11对应的VS2012版本,vc12对应的vs2013版本四、打开VS2012新建项目打开VS2012,在VS2012中新建一个控制台项目,文件->新建->项目->Visual C++->Win32控制台项目,输入名称,例如test,选择一个存放项目的文件夹,点击下一步,在空项目上打勾,点击完成。
五、VS2012包含目录、库目录配置先在源文件下建立一个.cpp源文件,取名为main.cpp调出属性管理器:点击视图—其他窗口—属性管理器打开属性管理器,可以看到一个属性管理器的窗口,接下来点开工程文件test,下边会有一个Debug|Win32的文件夹,点击打开,下有名为er的文件,右击属性打开属性页,选择通用属性下的VC++目录,右边会有包含目录和库目录,点击包含目录,添加以下三条路径,一个一个的添加,其实这些都是刚才OpenCV相关解压文件所在的目录:D:\opencv\build\includeD:\opencv\build\include\opencvD:\opencv\build\include\opencv2再点击库目录添加下面其中一条路径:64位:D:\opencv\build\x64\vc11\lib(编译64位软件时)32位:D:\opencv\build\x86\vc11\lib(编译32位软件时)点击链接器,选择输入,会在右侧看到附加依赖项,添加下面两个文件,其实在D:\opencv\build\x86\vc11\lib里面,这里添加的是Debug模式,会看到文件的结尾有dopencv_ts300d.libopencv_world300d.lib假如要添加Release模式,将d去掉即可Release模式:opencv_ts300.libopencv_world300.lib六、显示图片配置已经在上面的过程中结束了,下面让我们来显示一张图片,验证一下是配置是否成功。
VS2012使用教程步骤1:打开VS2012,看到界面,选择新建项目步骤2:在弹出的选择窗口里这样选择:注意选择的是win32控制台应用程序,下面的名称代表了项目的名字,可以随便改,我个人觉得没有改的必要,位置代表了项目所在的地方,默认是C盘,建议改到别的盘,新建一个文件夹专门保存,因为以后所有的C文件都会在这里了,方便管理。
选择好了之后点确定进入下一步。
步骤3:直接选择下一步。
步骤4:弹出的窗口是这样的我们要做修改,把预编译头取消,选择空项目,其他的选项不变。
选好之后应该如下图所示点完成即可。
步骤5:项目建立好了之后,在右侧的选项里,右击源文件,选择添加,新建项。
步骤6:在弹出的窗口选择C++文件,下面的名称是可以随便改,默认是“源”,.cpp是后缀名不要改。
在项目中新建的所有源文件都在项目所在的文件夹里,方便管理。
选择好了之后就点添加即可。
步骤7:想添加已经写好的源文件,右击源文件,选择添加,现有项在弹出的窗口里选择你想添加的源文件即可。
有时候发现窗口没有显示代码是一片空白,只需要双击一下源文件目录下的C文件,就会显示了。
步骤8:写好了一个C程序,Ctrl+F5或者F5调试成功之后,就想进行下一个C程序了,这时候如果想把程序彻底删除,不想要了,在源文件目录下的C文件上右击,选择移除--删除。
文件就会从电脑里删除。
如果不想删除,想保存下来,就点移除,C文件会从现在的窗口中移除不再影响下一个C 文件的编译调试,但是会保存在项目所在的文件夹里,想重新拿出来的时候只需要右击打开现有项,选择文件即可。
这样大家就发现了,不需要每次打开的时候都建立项目,只需要建立一个项目,每次打开VS2012的时候选择打开项目即可打开之后,想新建C文件还是打开现有C文件,看个人需求,也就是说,在一个项目里就可以集合你所有的C文件了,你只需要,调试好一个程序后把C文件从项目中移除,就可以进行下一个程序了。
PS:注意不能在源文件目录下有一个以上的C文件时进行编译,会互相影响导致出错,如下图还有不会的地方,用的时候出了什么问题,请自行百度解决方案或者咨询会长。
Visual Studio 2012 - Visual C++Visual C++强大而灵活的Visual C++ 语言和工具在Visual Studio 允许在 .NET framework 上运行本机Windows 应用商店apps、本机桌面apps 和托管apps 的开发。
Visual C++ 包含以下元素:Visual Studio 开发环境开发环境通过编写代码以支持整个开发工作流,从创建和管理的项目,调试,进行分析并部署到最终用户。
可视化工具C++compiler编译器支持本机代码以 .NET 公共语言运行时(CLR) 的开发和开发。
Visual C++ 直接支持x86计算机的生成,并包括面向x64 和ARM 的编译器。
它优化所有平台的性能。
库C 运行库(crt)包括安全增强选择要了解所造成安全问题的函数。
标准C++ 库包含(mfc) 库和标准模板库(STL)。
活动模板库(ATL)传递给COM 组件和apps 的创建。
Microsoft 基础类(MFC) 库选件对的桌面apps 创建具有传统或Office 样式的用户界面。
并行模式库(PPL)对CPU 执行的异步和并行算法。
C++ AMP (C++ 加速的大量并行)对于大量在GPU 执行的并行算法。
Windows 运行时C++ 模板库(WRL),为Windows 应用商店apps 和元素的COM 样式的开发。
.NET framework 选件类库(通过使用C++/CLI),STL/CLR 和C++ 支持库对托管apps 的开发。
此外,在中,当使用Visual C++ 时也可以访问Windows 应用商店apps 和桌面apps 的windows API。
标头文件和 .winmd 文件这些API 的包含在Visual Studio 中,在Windows 软件开发包(SDK)Windows 8的。
Visual Studio 2012 - Visual C++Win32桌面应用程序(Visual C++)可以创建Win32 app,如果要在从Windows 95 的windows 版本使用基于windows 的用户界面,并且可以运行到Windows 8的本机桌面应用程序时。
vs2012VS2012是指Visual Studio 2012,是微软公司推出的一款集成开发环境(IDE),用于开发各种应用程序。
它是Visual Studio系列中的一员,是开发人员在Windows平台上开发软件的首选工具之一。
本文将介绍VS2012的主要特点、功能以及它带来的一些优势。
VS2012是Visual Studio系列的第11个版本,于2012年发布。
它提供了许多新的功能和改进,使开发人员更加高效地开发应用程序。
其中一项重要的改进是改进的用户界面和操作体验。
VS2012采用了 Metro 风格的用户界面设计,使用户界面更加现代化、简洁,并提供更好的可视化效果。
VS2012还引入了多种新的工具和功能,以提升开发人员的效率。
其中一个重要的新功能是“IntelliSense”,它是一种自动代码补全和更智能的代码提示功能。
IntelliSense可以根据代码上下文提供更详细和精确的代码建议,从而减少开发人员的输入错误和提高代码质量。
此外,VS2012还引入了一种称为“开发人员故事板”的新功能。
开发人员故事板是一种以可视化方式管理软件开发过程的工具,它允许开发人员创建用户故事、定义需求并跟踪进度。
这种可视化的方式可以帮助开发团队更好地理解和协调各个开发任务,提高开发效率。
除了上述功能和工具外,VS2012还提供了多种项目模板和扩展,使开发人员能够快速创建各种类型的应用程序。
它支持多种编程语言,包括C++、C#、Visual Basic等,并提供了强大的调试和测试工具,帮助开发人员更好地诊断和修复代码中的错误。
VS2012还具有很强的集成性,可以与其他开发工具和技术集成,扩展其功能。
例如,可以与Microsoft Azure集成,以便将应用程序部署到云端。
它也可以与Team Foundation Server(TFS)集成,用于版本控制、团队协作和项目管理。
总的来说,VS2012是一款功能强大、易于使用的集成开发环境,为开发人员提供了丰富的工具和功能,帮助他们更高效地开发各种类型的应用程序。
vs2012与wdk驱动编程中编译环境设置(此例驱动在win7下要重启系统)1、新建项目向导中选择“空项目”如下图,然后点击完成。
2、在菜单“视图”里面选择“属性管理器”如下图:3、点击“配置管理器”(此工具在“工具箱”中“标准”)如下图:4、在弹出的的对话框中点击“活动解决方案配置”下拉菜单点“新建”,名字随便为了有意义在这取个名字“WdkDriver”如下图:5、设置“WdkDriver”为当前活动状态,如下图:6、设置“解决方案属性”,点击菜单“项目”“属性”设置如下图:A、选项“常规”设置如下图:B、“VC++目录”设置如下图:(inc文件夹下面有3个文件夹“api”“ddk”“crt”,lib下面“win7”“i386”(我用的是win7系统32位)C、“C++”设置如下图:1、“常规”设置:2、“优化”选择“禁用/od”3、“预处理器”选择“预处理器定义”输入如下内容“WIN32=100;_X86_=1;DBG=1;%(PreprocessorDefinitions)”4、“代码生成”选5、“高级”选择“调用约定”中选择“_stdcall/Gz”D、“链接器”设置如下图:1、“常规”设置2、“输入”选择“附加依赖项”输入如下内容“ntoskrnl.lib Hal.lib;wdm.lib;wdmsec.lib;wmilib.lib;ndis.lib;MSVCRT.LIB;LIBCMT.LIB“忽略所有默认库”中选择“是(/NODEFAULTLIB)”其他选项为空3、“清单文件”选择“生成清单”中选择“否(/MANIFEST:NO)”;“启用帐户控制(UAC)”中选择“否(/MANIFESTUAC:NO)”4、“系统”选择“子系统”中选择“本机(/SUBSYSTEM:NATIVE)”;“堆栈保留大小”“4194304”;“堆栈提交大小”“4096”;“驱动程序”中选择“驱动程序(/Driver)”5、“所有选项”参考WINDOWS 7 配置驱动开发环境vs2012+WDK7.6__脚本百事通设置以上属性后可以加入源文件编译事例:WdkDriver.h#pragma once#ifdef _cplusplusextern"c"{#endif#include<ntddk.h>#ifdef _cplusplus}#endif#define PAGEDCODE code_seg("PAGE")#define LOCKEDCODE code_seg()#define INITCODE code_seg("INIT")#define PAGEDDATA data_seg("PAGE")#define LOCKEDDATA data_seg()#define INITDATA data_seg("INIT")//#define arraysize(p) (sizeof(p)/sizeof((p)[0]))typedef struct_DEVICE_EXTENSION{PDEVICE_OBJECT pDevice;UNICODE_STRING ustrDeviceName; //设备名称UNICODE_STRING ustrSymLinkName; //符号链接名}DEVICE_EXTENSION,*PDEVICE_EXTENSION;//函数声明NTSTATUS CreateDevice(IN PDRIVER_OBJECT pDriverObject);void WdkUnload(IN PDRIVER_OBJECT pDriverObject);NTSTATUS WdkDispatchRoutine(IN PDEVICE_OBJECT pDevObj,IN PIRP pIrp);事例 WdkDriver.cpp#include"WdkDriver.h"#pragma INITCODE //指出下面函数加载到INIT内存区,加载完成后退出NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject,PUNICODE_STRING RegistryPath) {NTSTATUS status;KdPrint(("Enter DriverEntry\n"));//注册其他入口程序pDriverObject->DriverUnload = WdkUnload;pDriverObject->MajorFunction[IRP_MJ_CREATE] = WdkDispatchRoutine;pDriverObject->MajorFunction[IRP_MJ_CLOSE] = WdkDispatchRoutine;pDriverObject->MajorFunction[IRP_MJ_WRITE] = WdkDispatchRoutine;pDriverObject->MajorFunction[IRP_MJ_READ] = WdkDispatchRoutine;//创建驱动设备对象status = CreateDevice(pDriverObject);KdPrint(("DriverEntry end\n")); //宏,调试版(Checked版)用DbgPrint()代替,发行版(Free版)不执行任何操作.//类似MFC中的TRACE()return status;}//创建设备#pragma INITCODENTSTATUS CreateDevice(IN PDRIVER_OBJECT pDriverObject){NTSTATUS status;PDEVICE_OBJECT pDevObj;PDEVICE_EXTENSION pDevExt;//创建设备名称UNICODE_STRING devName;RtlInitUnicodeString(&devName,L"\\Device\\MyWdkDevice");//创建设备status = IoCreateDevice(pDriverObject,sizeof(DEVICE_EXTENSION),&(UNICODE_STRING)devName,FILE_DEVICE_UNKNOWN, //设备为独占设备,只能被一个应用程序使用0,TRUE,&pDevObj);if(!NT_SUCCESS(status))return status;//填充PDEVICE_EXTENSION结构,得到设备自定义信息pDevObj->Flags |= DO_BUFFERED_IO;pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;pDevExt->pDevice = pDevObj;pDevExt->ustrDeviceName = devName;//创建符号链接,此符号指向真正的设备名称UNICODE_STRING symLinkName;RtlInitUnicodeString(&symLinkName,L"\\??\\WdkApp");pDevExt->ustrSymLinkName = symLinkName;status = IoCreateSymbolicLink(&symLinkName,&devName);if(!NT_SUCCESS(status)){IoDeleteDevice(pDevObj);return status;}return STATUS_SUCCESS;}//卸载设备#pragma PAGEDCODEvoid WdkUnload(IN PDRIVER_OBJECT pDriverObject){PDEVICE_OBJECT pNextObj;KdPrint(("Enter DriverUnload\n"));pNextObj = pDriverObject->DeviceObject;while(pNextObj != NULL){PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)pNextObj->DeviceExtension;//删除符号链接UNICODE_STRING pLinkName = pDevExt->ustrSymLinkName;IoDeleteSymbolicLink(&pLinkName);IoDeleteDevice(pDevExt->pDevice);}}//事务函数,对设备的具体操作#pragma PAGEDCODENTSTATUS WdkDispatchRoutine(IN PDEVICE_OBJECT pDevObj,IN PIRP pIrp){KdPrint(("Enter WdkDispatchRoutine\n"));NTSTATUS status = STATUS_SUCCESS;//完成IRPpIrp->IoStatus.Status = status;pIrp->rmation = 0;IoCompleteRequest(pIrp,IO_NO_INCREMENT);KdPrint(("Leave WdkDispatchRoutine"));return status;}。
VS2012发布网站详细步骤1、打开你的VS2012网站项目,右键点击项目》菜单中重新生成一下网站项目;再次点击右键》发布:2、弹出网站发布设置面板,点击<新建..>,创建新的发布配置文件:输入你自己定义的配置文件名:3、点击下一步:在发布方法中选“文件系统”,这样我们可以发布到自己指定的本机文件上。
选择自己指定的文件夹:通过点击下图中右上角红色箭头处创建新的文件夹,自定义命名(我的就写WebSite )。
点击打开,进入下一步4、在配置中,要选择“Release”——发布模式(Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。
Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序)5、点击下一步:进入发布前的预览界面点击发布即可以发布你指定的文件夹中,这里,我发布的是C盘下的WebSite文件夹中。
发布成功后,点开文件夹,所有页面的.cs文件都消失了,都去哪里了呢?是bin文件夹里面吗?大家猜一猜。
发布好的截图:6、通过》控制面板》管理工具》启动‘Internet信息服务(IIS)管理器’进入IIS界面。
右键单击网站》添加网站7、下面图中,左边红色方框内输入自定义的网站名称(请尽量用英文,这里我就写MyPhotoSite),右边红色箭头处需要点击‘选择(E)…’进行更改。
大家可以点开下拉列表框根据自己的网站版本进行选择(一般请选择不带有Classic的)。
这里我选择的是选择DefaultAppPool,8、选择“已发布网站文件夹”的物理路径。
9、点击下拉列表选择“自己当前的IP地址”点击确定:这时我们的网站就还差一步就发布好了,点击网站MyPhotosSite,再点击下图红色箭头处切换到“内容视图”。
10、最后一步:注册IIS服务器。
命令:aspnet_regiis -i(请复制),先在程序菜单》VS2012里面》Visual Studio Tools》VS2012开发人员命令提示。
win7-vs2012下安装.netframework的过程图⽂详解第⼀, vs和.net的对应关系⼤致如下 framework 4.0 framework 4.5 framework 4.6.1 framework 4.6.2第⼆,在win7上安装vs2010之后会有.net4.5 frame work已经安装好了。
vs2012 update5 也可以安装,但不是必须的。
第三,如果以后的开发不需要⽤到4.5.1 4.5.2 4.6 4.6.1 那么是可以直接安装4.6.2的。
但是如果会⽤到的话,就安装上,需要依次安装运⾏库,否则会因为⾼版本的存在⽽不能安装成功,除了各个版本的⽬标包之外。
上图是本⼈下载的各个安装⽂件。
以4.6为例,需要安装运⾏包,开发包,⽬标包。
⼀般来说只有安装了⽬标包,才能在vs的选项框中显⽰出对应的.net 版本来。
运⾏库:NDP46-KB3045557-x86-x64-AllOS-ENU.exe开发库+⽬标库:NDP46-TargetingPack-KB3045566.exe(⽹络版的运⾏库:NDP46-KB3045560-Web.exe)对于4.6.4来说:NDP462-DevPack-KB3151934-CHS.exe 中⽂语⾔包NDP462-DevPack-KB3151934-ENU.exe 开发包+⽬标包NDP462-KB3151800-x86-x64-AllOS-ENU.exe 运⾏库NDP462-KB3151802-Web.exe ⽹络版运⾏包误区:只安装运⾏库+开发库,但是没有安装⽬标包。
解决办法:有的版本提供了独⽴的⽬标包,但是有的却是将⽬标包和开发包合在⼀起并名为开发包。
另外,必须注意居然有的实际是语⾔包,却取名为开发包中⽂版。
(这⾥⽆语很多遍,也坑爹很多遍。
微软的包敢不敢整洁点?)控制⾯板:vs2012中:运⾏库的下载地址:以上所述是⼩编给⼤家介绍的win7-vs2012下安装.net frame work 的过程图⽂详解,希望对⼤家有所帮助,如果⼤家有任何疑问,欢迎给我留⾔,⼩编会及时回复⼤家的!。
VisualStudio各版本区别Visual Studio 是微软公司推出的开发环境,Visual Studio 可以用来创建Windows 平台下的Windows 应用程序和网络应用程序,也可以用来创建网络服务、智能设备应用程序和 Office 插件。
V.S.2012 .1、VS2012和VS2010相比,最大的新特性莫过于对Windows 8 Metro开发的支持。
Metro天生为云+端而生,简洁、数字化、内容优于形式、强调交互的设计已经成为未来的趋势。
不过对于开发者而言,要想使用这项新功能,必须要安装Windows 8 RP版。
该版本中包含了新的Metro应用程序模板,增加了JavaScript功能、一个新的动画库,并提升了使用XAML的Metro应用程序的性能。
2、VS2012 RC在界面上,比Beta版更容易使用,彩色的图标和按照开发、运行、调试等环境区分的颜色方案让人爱不释手。
3、VS2012集成了ASP。
NET MVC 4,全面支持移动和HTML5,WF 4.5相比WF 4,更加成熟,期待已久的状态极工作流回来了,更棒的是,它的设计器已经支持C#表达式(之前只能用VB。
NET)。
4、VS2012支持.NET 4.5,和.NET 4.0相比,4.5更多的是完善和改进,4.5也是Windows RT被提出来的首个框架库,.NET获得了和Windows API同等的待遇。
5、VS2012+TFS2012实现了更好的生命周期管理,可以这么说,VS2012不仅是开发工具,也是团队的管理信息系统。
6、VS2012对系统资源的消耗并不大,不过需要Windows 7/8的支持。
V.S.2010特点支持Windows Azure,微软云计算架构迈入重要里程碑。
助力移动与嵌入式装置开发,三屏一云商机无限。
实践当前最热门的 Agile/Scrum 开发方法,强化团队竞争力。
升级的软件测试功能及工具,为软件质量严格把关。
C#开发ActiveX组件流程以及注意事项 唯笑志在 QQ群:54256083 ITER职业交流群:141588103 软件破解技术群:52598922
目录 C#开发ActiveX组件流程以及注意事项 ......................................................................................... 1 一.前言 ................................................................................................................................... 2 二.开发环境 ........................................................................................................................... 2 三.组件开发过程 ................................................................................................................... 2 3.1 新建“MyActiveX”项目 ............................................................................................... 2 3.2 在ActiveXControl组件类上增加属性和方法 .......................................................... 3 3.3 增加客户端信任代码 ................................................................................................ 5 3.4修改AssemblyInfo.cs 文件 ........................................................................................ 9 3.5 修改ActiveXControl项目属性 .................................................................................. 9 四.ActiveX控件的打包发布 ................................................................................................ 11 4.1 添加“安装和部署”工程 ...................................................................................... 12 4.2 添加项目主输出 ...................................................................................................... 13 4.3 设置Register 属性为vsdrpCOM ............................................................................ 13 4.4 查看是否注册了ActiveX组件 ................................................................................ 14 五.测试和加载ActiveX过程 ............................................................................................... 15 5.1 建立Web 应用程序项目 ....................................................................................... 15 5.2 测试结果 .................................................................................................................. 16 5.3 IE设置 .................................................................................................................... 17 六.自动安装ActiveX ............................................................................................................ 19 6.1 打包cab安装包 ...................................................................................................... 19 6.2 自动安装 .................................................................................................................. 21 七.引用程序设计说明 ......................................................................................................... 22 一.前言 ActiveX 控件以前也叫做OLE 控件或OCX 控件,它是一些软件组件或对象,可以将其 插入到WEB 网页或其它应用程序中。使用ActiveX 插件,可以轻松方便的在Web 页中插 入多媒体效果、交互式对象以及复杂程序等等。 通常使用MFC或VB 开发ActiveX 控件,本文章来讨论Microsoft Visual Studio 开发工具 实现开发ActiveX组件整个过程。在开发过程中有些注意事项和细节需要注意。
二.开发环境 开发工具:VS2012 操作系统:Windows 8.1 .NET版本:2.0及以上版本 开发语言:C#
三.组件开发过程 3.1 新建“MyActiveX”项目 把项目里默认建立的类库删除掉。新建“用户控件”,并且命名为“ActiveXControl”。如下图: 图 3.1-1 项目组件 3.2 在ActiveXControl组件类上增加属性和方法 [ComVisible(true)] //允许进行COM注册 [Guid("C341DFF3-BA35-4AA4-8FD1-EB7715F75E86")] //标识在注册表中唯一的GUID码。
[ClassInterface(ClassInterfaceType.AutoDual)] //标识为某个类生成的类接口的类型。 public partial class ActiveXControl : ObjectSafety { public ActiveXControl() { InitializeComponent(); } /// /// 组件本身内部的事件,并把信息显示在组件的Label上。 /// /// /// private void button1_Click(object sender, EventArgs e) { this.label1.Text = "单击成功"; }
/// /// 这是一个公开的方法,供网页的JAVASCRIPT调用的,进行交互。 /// public void Test() { label1.Text = "测试成功"; } } 在ActiveXControl组件中入一个Button和Label控件,Button的单击事件对应着button1_Click事件函数,并且改变Label的Text属性,并且改变ActiveXControl的背景颜色。如下图:
图3.2-1 组件界面 注:可以在菜单“工具”中的“创建GUID”中创建唯一的GUID码,与类的[Guid("C341DFF3-BA35-4AA4-8FD1-EB7715F75E86")]标识有关。如下图: 图3.1-2 创建GUID码 注:必须在组件类上标识[Guid("C341DFF3-BA35-4AA4-8FD1-EB7715F75E86")]属性,因为有可能每次生成项目的时候,这个GUID都会改变,对于应用系统来讲,最好是固定的,这样就不需要重新部署了。
3.3 增加客户端信任代码 为了让ActiveX 控件获取客户端的信任, 控件类还需要实现一个名为 “IObjectSafety”的接口,先创建该接口,并且定义该接口中方法,如下代码。(注:不能修改该接口的GUID 值)。
[ComImport, Guid("4A359FBB-C9A4-494E-B048-AC068DB4FCB2")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IObjectSafety { [PreserveSig] int GetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] ref int pdwSupportedOptions, [MarshalAs(UnmanagedType.U4)] ref int pdwEnabledOptions);