前几天有人问我应该使用参数关键字out
而不是ref
.虽然我(我认为)明白之间的差别ref
和out
关键字(已问过)和最好的解释似乎是ref
== in
和out
,都有些什么(假设或代码)的例子,我应该一直使用out
,而不是ref
.
既然ref
更一般,你为什么要用out
?它只是语法糖吗?
我正在编写一个小型C#应用程序,以便在检测到其他鼠标设备时禁用设备(我的笔记本电脑触摸板),如果未检测到鼠标,则再次启用触摸板.我甚至无法在设备管理器中禁用触摸板(它在默认的鼠标类驱动程序上运行).
我正在进入设备驱动程序开发,所以我想也许我可以编写一个小的过滤器驱动程序,它只接受IOCTL来启用和禁用在设备堆栈上传递鼠标事件消息,并通过原始PDO从用户模式获取消息.但是,我问了这个问题,并且有人建议我可以通过SetupDi ..函数在usermode中执行此操作.这将是非常好的,因为这种原始的PDO通信方法是一个可以使用的PITA.
我以前只使用过SetupDiGetClassDevs,而且有很多这样的人,对于这部分Win32 API有更多经验的人可以快速告诉我应该调用什么来停止/禁用鼠标设备或其界面,或者是否有在框架的黑暗角落某处可以做到这一点(也许在WMI?).
更新(2009年9月24日)我想出了如何使用过滤器驱动程序执行此操作并发布了我在原始问题上的操作方式.我仍然想知道是否可以直接从Win32启用或禁用设备,如果可以,如何 - 所以我将打开这个问题.
很快,我将需要为我的大学的工程学院和一大批工程技术专业的学生介绍我的荣誉项目.虽然所有参加会议的人都具有技术头脑,但并非所有人都是程序员,而且大多数人都来自其他工程学科.
我之前做过演讲,我有信心和一群人说话,但我现在意识到我之前给过的所有演讲都是CS/SE的专业和教学人员.我想知道我的演讲风格是否假设我正在向其他软件爱好者展示,所以他们会知道我在说什么,我可以进行一个涉及观众的更具互动性的演示.
我的荣誉项目并不是非常复杂或理论上的,我有一个原型C#Winforms应用程序,但它的设计是可扩展的,并且将来可以使用不同的数据源(ODBC或WS)进行操作,还有一些关于它如何扩展的研究规则引擎和DSL,并变成了一个可销售的产品.正在测试我的原型的组织通过自动化关键业务功能每年节省数万美元.
我曾计划通过一些实时编码和UML风格的图表来展示它的可扩展性.我非常喜欢做演示和现场编码,但我不知道非程序员是否可以访问这种演示文稿,我担心如果我太过于讨厌和技术性,我可能会疏远观众和评委.
您发现以非程序员感兴趣的方式呈现软件项目的有效技术是什么?
我对驱动程序开发很新,并试图编写一个简单的过滤器驱动程序来启用或禁用键盘或鼠标设备.如果我可以使它工作,我想用它来插入鼠标插入我的笔记本电脑上的触摸板.我意识到可能有软件已经做到这一点,但我真的对设备驱动程序感兴趣,并希望自己学习如何做到这一点.
我正在使用随WDK一起提供的kbfiltr和moufiltr示例,作为上层过滤器驱动程序安装.kbfiltr示例创建一个pdo,可以通过usermode程序枚举和连接.这允许我将IOCTL发送到由KbFilter_EvtIoDeviceControlForRawPdo处理的PDO .但是,当我尝试做任何与过滤器驱动程序相关的事情时,比如调用KbFilter_EvtIoInternalDeviceControl所以我可以做类似的事情
VOID
KbFilter_EvtIoInternalDeviceControl(
IN WDFQUEUE Queue,
IN WDFREQUEST Request,
IN size_t OutputBufferLength,
IN size_t InputBufferLength,
IN ULONG IoControlCode
)
...
hDevice = WdfIoQueueGetDevice(Queue);
devExt = FilterGetData(hDevice);
switch (IoControlCode) {
...
case IOCTL_INTERNAL_KEYBOARD_DISCONNECT:
//
// Clear the connection parameters in the device extension.
//
devExt->UpperConnectData.ClassService = NULL;
break;
...
}
Run Code Online (Sandbox Code Playgroud)
我得到了一个BSOD.它不是上面的代码,在vanilla示例中,set to null被注释掉,只是调用Kbfilter会导致BSOD.我试图直接在PDO中设置设备扩展,但这也会导致BSOD,可能是因为它是PDO devExt,而不是kbfiltr?
(相关:什么是从BSOD获取堆栈跟踪的好方法?我使用Virtual PC作为我的测试环境和未经检查的XPSP3版本)
我不能直接向驱动程序堆栈发送IOCTL_INTERNAL_KEYBOARD_DISCONNECT(我知道输入设备一次只接受一个连接?)因此需要原始PDO.我真的只需要发送两个IOCTL(启用和禁用),我想我会使用键盘断开连接,因为这些已经定义.
如果我对这些假设有任何错误,请告诉我,我知道我真的是一个菜鸟,但我没有找到很多关于通过PDO进行此类通信的文档.
我试图将C++结构转换为C但仍然获得"未声明的标识符"?C++是否有不同的语法来引用结构?
struct KEY_STATE
{
bool kSHIFT; //if the shift key is pressed
bool kCAPSLOCK; //if the caps lock key is pressed down
bool kCTRL; //if the control key is pressed down
bool kALT; //if the alt key is pressed down
};
Run Code Online (Sandbox Code Playgroud)
我在另一个结构中使用KEY_STATE类型的变量:
typedef struct _DEVICE_EXTENSION
{
WDFDEVICE WdfDevice;
KEY_STATE kState;
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
Run Code Online (Sandbox Code Playgroud)
导致 错误C2061:语法错误:标识符'KEY_STATE'
...在KEY_STATE kState线上; 我正在使用WDK编译器构建,如果这有任何区别.这当然是在头文件中.我正在将C++ WDM驱动程序移植到WDF和C.
初始化器可以用括号括起来.要避免此问题,请将声明符括在括号中或使其成为typedef.
当编译器将表达式检测为类模板参数时,也可能导致此错误; 使用typename告诉编译器它是一个类型.
将KEY_STATE更改为typedef结构仍会导致此错误,实际上会导致更多错误.没有免费的括号或太多括号中的东西,这是文章建议的另一件事.
偶尔,我不得不在VBA中构建一个SQL字符串并使用它来执行它Docmd.RunSql()
.我总是通过将变量连接到字符串中来构建这些字符串,例如:
Dim mysqlstring as String
mysqlstring = "INSERT INTO MyTable (Field1, Field2, Field3 ...) VALUES ("
mysqlstring = mysqlstring + Me.TextMyField1 + ", " 'parameter comments
mysqlstring = mysqlstring + Me.TextMyField2 + ", "
mysqlstring = mysqlstring + Me.TextMyField3 + ", "
...
mysqlstring = mysqlstring + ");"
Docmd.RunSql mysqlstring
Run Code Online (Sandbox Code Playgroud)
VBA似乎没有一元连接运算符(如+ =),虽然这看起来并不理想,但至少我可以评论每个参数并单独更改它们.它比一个怪物串联字符串更容易阅读和更改.但它似乎仍然是一种构建SQL字符串的可怕方法.我有一个约50个参数在工作,所以50行mysqlstring = mysqlstring +...
.不可爱.
顺便提一下,这排除了使用行继续来格式化字符串,因为对单个字符串可以使用的行继续数有限制(提示:小于50).此外,VBA不会让你在续行后发表评论,grr!
直到最近,我认为这是构建这些字符串的唯一方法.但是最近我看到了一个不同的模式,在这个问题(VB.NET)的字符串中注入参数我发布了答案,并想知道是否有相当于Parameters.AddWithValue()
VBA,或者如果这甚至比任何更好字符串连接方法.所以我认为这值得提出自己的问题.也许我在这里缺少一些东西.
一些Access专家可以澄清在Access/VBA中构建SQL字符串的最佳实践.
在寻找答案并尝试一些不同的事情但没有成功之后,我真的是在绝望中发布这个.
我有一个Access数据库,我最近将表迁移到SQL 2005,Access继续作为前端提供表单,报告和查询.
但是,自从转移到Access FE/SQL BE设置以来,用户一直在报告有时,当他们输入新记录时,他们点击子窗体(保存记录)或点击菜单本身的保存,它会跳转到现有记录.新记录已保存,但由于某些原因,访问在刷新时切换到不同的记录.然后,用户必须关闭,找到保存的记录,然后继续编辑它.
场景:用户输入报价并填写所有报价详细信息,客户,日期等,然后单击行项子表单以添加产品(或单击保存在菜单中),然后突然显示报价表(和line-item subform)显示一些随机引用的详细信息.随机引用可能是最近的,也可能是几年前的,并且与他们输入的报价没有任何共同之处.
这种奇怪的行为只发生在插入新记录时,从不编辑现有记录.用户告诉我,当他们在打开数据库后添加新的(报价,客户,等等)时,它会" 更频繁地 " 发生.
我注意到它只发生在具有子表单的表单上,所以我首先想到的是它与表单数据保存之前通过子表单数据发送Access有关,导致PK违规.但这似乎没有发生:SQL服务器上没有错误,并且记录已成功保存.在添加子表单记录之前强制用户保存主表单记录(即在报价上,强制他们在添加行项目之前保存报价)不起作用,它只会导致保存时跳转(有时).
它不是在保存或当前运行的vba,我在所有事件处理程序上设置了断点,因为它跳转并且没有执行vba.一些"跳跃"表单在表单上没有vba.但都有子表格.我怀疑它与记录锁定有关.
运行这些表的服务器是SQL Server 2005,用户使用的是Access 2000和2003的混合,主要是带有几个旧Win2k盒的XP SP3.他们正在使用合并复制,并且有几个用户正在运行复制的SSEE2005版本并订阅主服务器.大多数用户不会被复制,只是通过ODBC或SQL本机客户端连接直接连接到服务器.但我已经证实这种情况发生在所有用户身上,通常是一天一次或两次,而且之前发生在我身上.所以它不是用户问题.
关于这种行为最糟糕的部分是它只在某些时候发生,我没有设法找到一个总会导致它发生的场景.
如果有人之前经历过这样的事情,请告诉我你是如何解决的,甚至建议也欢迎.
更新: (1/10/09)问题解决了,感谢David Fenton.在打开它以添加记录之前将表单设置为数据输入模式(Form.DataEntry = true)确实可以防止跳转.自从我在一周前更改此内容后,客户端报告完全没有任何问题.
这就是我想要的:我为POSIX编写了一个巨大的遗留C/C++代码库,包括一些非常类似POSIX的东西,比如pthreads.这可以在Cygwin/GCC上编译,并在Windows下使用Cygwin DLL作为可执行文件运行.
我想要做的是将代码库本身构建到Windows DLL中,然后我可以从C#中引用它并在其周围编写一个包装器以编程方式访问它的某些部分.
我在http://www.cygwin.com/cygwin-ug-net/dll.html上使用非常简单的"hello world"示例尝试了这种方法,它似乎不起作用.
#include <stdio.h>
extern "C" __declspec(dllexport) int hello();
int hello()
{
printf ("Hello World!\n");
return 42;
}
Run Code Online (Sandbox Code Playgroud)
我相信我应该能够使用以下内容引用在C#中使用上述代码构建的DLL:
[DllImport("kernel32.dll")]
public static extern IntPtr LoadLibrary(string dllToLoad);
[DllImport("kernel32.dll")]
public static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName);
[DllImport("kernel32.dll")]
public static extern bool FreeLibrary(IntPtr hModule);
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate int hello();
static void Main(string[] args)
{
var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "helloworld.dll");
IntPtr pDll = LoadLibrary(path);
IntPtr pAddressOfFunctionToCall = GetProcAddress(pDll, "hello");
hello hello = (hello)Marshal.GetDelegateForFunctionPointer(
pAddressOfFunctionToCall,
typeof(hello));
int theResult …
Run Code Online (Sandbox Code Playgroud) 有没有人知道部分或完全自动化驱动程序测试安装的方法?
我是驱动程序开发的新手,并且习惯于在更高级别的语言中使用更多的测试驱动方法,因此转向我无法轻松测试的环境对我来说是一个进步.我在我的测试环境中使用Virtual PC,目前必须重置它,打开设备管理器,选择设备,点击一堆" 你真的确定你不会安装其中一个系统驱动程序 "类型的对话框,然后在测试环境启动时,最终重启测试环境,同时在主机中重启WinDbg ... argh.
在重复这个过程很多次之后,肯定必须有更好的方法来做到这一点?商业驱动程序开发人员在测试环境中使用哪些工具/方法/技巧来运行其驱动程序?
注意,这不是关于单元测试驱动程序,我还没有达到那个阶段或者知道它是否可能.这只是为了启动附加WinDbg的测试环境,以确保我可能做的一些小改变正在做我期望的事情.
我有一个在Sql server 2005下运行的数据库,带有合并复制.我想将一些FK列更改为"not null",因为它们应始终具有值.SQL服务器不会让我这样做,这就是它所说的:
- 无法修改表格.删除合并复制使用的rowguid列上的默认约束无效.在执行内部复制过程期间,架构更改失败.有关更正操作,请参阅此错误消息附带的其他错误消息.交易在触发器中结束.批次已中止.
我根本没有尝试更改rowguid列上的约束,只是在另一个充当FK的列上.我想设置的其他列不为null,因为没有该信息(即客户,客户名称)记录没有任何意义.
问题:有没有办法在不关闭复制然后重新打开它的情况下将列更新为"非空"?这甚至是最好的方法 - 我应该使用约束吗?
sql-server ssms sql-server-2005 constraints merge-replication