我想有一个Visual Studio项目,它构建一个DLL文件和一个导入库(.lib)文件.(导入库是一个静态链接库,负责在其他使用它的项目中加载该DLL文件).
所以我去了Visual Studio C++ 2008 Express Edition,创建了类库类型的新项目,并将"配置类型"设置为"Dyanamic Library(.dll)".
但是当我构建解决方案时,我看到的唯一相关输出文件是DLL文件; 我没有看到生成任何LIB文件.我查看了项目目录和所有子目录(Release和Debug).
我相信可以同时构建LIB和DLL文件,因为在MSDN上它说"链接器在构建DLL时创建导入库". 此外,该网站的另一个用户是使用Visual C++同时创建LIB和DLL文件.
那我该怎么办呢?
所有以下API都做同样的事情:打开一个文件并为每一行调用一个块.有什么偏好我们应该使用一个而不是另一个?
File.open("file").each_line {|line| puts line}
open("file").each_line {|line| puts line}
IO.foreach("file") {|line | puts line}
Run Code Online (Sandbox Code Playgroud) 我在C++ 11中阅读了一系列关于新<system_error>标题的深思熟虑的博客文章.它表示标头定义了一个error_code类,它表示操作(例如系统调用)返回的特定错误值.它表示标头定义了一个system_error类,它是一个异常类(继承自runtime_exception)并用于包装error_codess.
我想知道的是如何将系统错误实际转换errno为一个,system_error所以我可以抛出它.例如,POSIX open函数通过返回-1和设置来报告错误errno,因此如果我想抛出异常,我应该如何完成下面的代码?
void x()
{
fd = open("foo", O_RDWR);
if (fd == -1)
{
throw /* need some code here to make a std::system_error from errno */;
}
}
Run Code Online (Sandbox Code Playgroud)
我随机试了一下:
errno = ENOENT;
throw std::system_error();
Run Code Online (Sandbox Code Playgroud)
但是在what()调用时,结果异常不返回任何信息.
我知道我可以做throw errno;但我想以正确的方式使用新的<system_error>标题.
有一个构造函数system_error需要一个单独error_code的参数,所以如果我可以转换errno为error_code那么其余的应该是显而易见的.
这似乎是一个非常基本的东西,所以我不知道为什么我找不到一个好的教程.
我在ARM处理器上使用gcc 4.4.5,如果这很重要的话.
似乎Rust的枚举类型的每个介绍性文档都解释了如何匹配您拥有的枚举对象,但是如果您不拥有枚举对象并且您只是想要匹配它的引用呢?我不知道语法是什么.
以下是我尝试匹配枚举引用的一些代码:
use std::fmt;
use std::io::prelude::*;
pub enum Animal {
Cat(String),
Dog,
}
impl fmt::Display for Animal {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
Animal::Cat(c) => f.write_str("c"),
Animal::Dog => f.write_str("d"),
}
}
}
fn main() {
let p: Animal = Animal::Cat("whiskers".to_owned());
println!("{}", p);
}
Run Code Online (Sandbox Code Playgroud)
在尝试编译时,Rust Playground会在匹配的前两种情况下给出错误:
error[E0308]: mismatched types
--> src/main.rs:12:13
|
12 | Animal::Cat(c) => f.write_str("c"),
| ^^^^^^^^^^^^^^ expected &Animal, found enum `Animal`
|
= note: …Run Code Online (Sandbox Code Playgroud) 我在一家销售USB设备并为其提供驱动程序的公司工作.
在Windows 7中,您可以为USB设备安装和使用未签名的INF驱动程序文件,只要它们不向内核添加任何代码即可.我们公司使用Microsoft(usbser.sys和winusb.sys)提供的通用驱动程序,因此我们永远不需要签署我们的驱动程序包.
根据我们的客户和另一个Stack Overflow问题的报告,Windows 8的驱动程序签名要求发生了哪些变化?和Arduino论坛一样,听起来Windows 8 Consumer Preview有更严格的签名要求,需要所有第三方INF文件签名.人们在尝试安装适用于Windows 7的驱动程序时收到的错误消息是:
第三方INF不包含数字签名信息.
微软的官方消息是什么证实了Windows 8的最终版本仍然需要签名?来自MSDN.com的一两句就足够了,但我找不到任何东西.
我正在考虑购买签名证书,但在我支付200美元之前,我想确保从长远来看我真的需要它.新的签名要求可能只是在消费者预览中,而不是在真实版本中?
是否可以创建一个C++头文件(.h)来声明一个类及其公共方法,但是没有定义该类中的私有成员?我发现有几页说你应该在头文件中声明该类及其所有成员,然后在你的cpp文件中单独定义方法.我问,因为我想有在一个Win32 DLL中定义一个类,我希望它是正确的封装:在内部实现这个类的可能会发生变化,包括它的成员,但这些变化不会影响使用该类的代码.
我想如果我有这个,那么它将使编译器无法提前知道我的对象的大小.但是,这应该是罚款,只要编译器是足够聪明的使用构造,只是指针传递给周围的位置在我的对象存储内存,并且从来没有让我跑"的sizeof(MyClass的)".
更新: 感谢所有回答的人!似乎pimpl成语是实现我所谈论的好方法.我要做类似的事情:
我的Win32 DLL文件将有一堆单独的函数,如下所示:
void * __stdcall DogCreate();
int __stdcall DogGetWeight(void * this);
void __stdcall DogSetWeight(void * this, int weight);
Run Code Online (Sandbox Code Playgroud)
这是Microsoft编写DLL文件的典型方式,因此我认为可能有很好的理由.
但是我想利用C++对类的优秀语法,所以我将编写一个包装类来包装所有这些函数.它将有一个成员,这将是"无效*pimpl".这个包装器类将非常简单,我可能只是声明它并在头文件中定义它.但是这个包装类除了让C++代码看起来很漂亮外没有任何其他目的.
您可以使用gcc向C中的标识符添加多个属性吗?这就是我现在拥有的.我遗漏了包含声明,因为它们在帖子中变得混乱.如果有一种方法可以添加两个,那么一般语法是什么,以及如何使用defintion和原型来完成它?谢谢.:-)
main() {
printf("In Main\n");
}
__attribute__ ((constructor)) void beforeMain(void)
{
printf("Before Main\n");
}
Run Code Online (Sandbox Code Playgroud) 我公司从Go Daddy 购买了驾驶员签名证书.我用它来签署一个简单的INF文件,它是我们使用微软usbser.sys的一些USB设备的驱动程序.一切似乎都在我签名的Windows 7 64位计算机上运行:如果我右键单击INF文件并选择"安装",那么我看到的第二个警告是显示正确的发布者名称的良好警告:

但是,如果我转到另一台计算机(Windows Vista 64位),右键单击INF文件,然后选择"安装",然后我收到此错误消息:

这让我觉得我的驱动程序没有正确签名,并且它在我的计算机上看起来很好的唯一原因是因为我在Go Daddy的安装过程中安装了一些root/intermediate/cross证书.我绝对希望我的用户能够看到我们是经过验证的发布者,而无需在他们的计算机上手动安装证书.
INF文件和.cat文件位于同一目录中.
有谁知道为什么会这样,以及我如何解决它?
我怀疑主要问题是我在运行时遇到此错误signtool verify /v pololu.cat(下面有更多详细信息),我还没弄清楚原因:
SignTool错误:已处理证书链,但终止于信任提供程序不信任的根证书.
该驱动程序签名证书是从去爸爸一个新的产品,他们在几个星期前推出.我不完全确定它与代码签名证书有何不同,但价格相同.我按照Go Daddy网站上的说明下载并安装证书,但说明与现实完全不符.在步骤1中安装Microsoft Cross证书后,我看到一条红色警告消息说:
在安装证书之前,必须使用Windows Update更新根证书,或者从我们的存储库手动下载并安装根证书.
我不知道该怎么做.我确实从他们的存储库安装了一些GoDaddy根证书,但没有明显区别.
我安装了Windows驱动程序工具包(WDK)的最新版本(8.0),然后安装了适用于Windows 8的Windows软件开发工具包(SDK)的最新版本(8.0).这使我可以访问inf2cat和signtool实用程序.这两个套件都是在上个月内发布的,所以我们可能会遇到一些新的漏洞.
在一个新目录中,我放了三个文件:
pololu_usb_to_serial.inf,我要签署的INF文件.它很长但很简单; 你可以在这里阅读.此INF文件是独立驱动程序; 我们的驱动程序包中不需要其他文件.这个文件基本上与我们公司多年来成功分发(未签名)的版本相同,但我必须对Inf2Cat进行一些更改才能接受它.mscvr-cross-gdroot-g2.crt,我从Go Daddy证书库下载的.我相信这是证明微软信任"Go Daddy Root Certificate Authority - G2"的交叉证书,但我不完全确定这是否是正确的证书.sign_it.bat,我运行的批处理文件进行签名.批处理文件只包含:
"C:\Program Files (x86)\Windows Kits\8.0\bin\x86\inf2cat" /v /driver:%~dp0 /os:XP_X86,Vista_X86,Vista_X64,7_X86,7_X64,8_X86,8_X64
"C:\Program Files (x86)\Windows Kits\8.0\bin\x86\signtool" sign …Run Code Online (Sandbox Code Playgroud) 我正在编写一个Win32 DLL,其函数可以将目录添加到Windows PATH环境变量(在安装程序中使用).
在DLL运行后查看Regedit或控制面板中的环境变量,向我显示我的DLL已成功添加到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment和的路径HKEY_CURRENT_USER\Environment.
但是当我启动一个新的命令提示符(运行DLL之后)时,我添加的目录没有显示在输出中echo %PATH%,我无法通过键入其名称来访问该目录中的可执行文件.
我认为我的程序没有很好地通知系统PATH已经改变,或者它可能在更改完全生效之前通知它们.我阅读了微软的一篇文章,该文章说WM_SETTINGCHANGE在更改环境变量后广播该消息,我正在使用以下代码:
DWORD result2 = 0;
LRESULT result = SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0,
(LPARAM)"Environment", SMTO_ABORTIFHUNG, 5000, &result2);
if (result == 0){ /* ... Display error message to user ... */ }
Run Code Online (Sandbox Code Playgroud)
我的电话的顺序是:RegCreateKeyEx,RegSetValueEx,RegCloseKey,SendMessageTimeout
如果我在控制面板"环境变量"窗口中按"确定",我的DLL对PATH所做的更改将显示在新创建的命令提示中,因此控制面板正在做一些事情来传播PATH更改; 我想弄明白它是什么,做同样的事情.
有谁知道我应该怎么做?
我正在运行64位Windows Vista,但我希望这适用于所有Windows XP,Vista和Windows 7操作系统.
更新: 我上面发布的代码的问题是我没有在"环境"字符串上放置L前缀.虽然它没有明确地说明我在Microsoft文档中的任何地方,但LPARAM需要是指向WCHAR字符串(2字节字符)而不是CHAR字符串的指针,这是Visual Studio编译器默认生成的当我写一个字符串文字.我的问题的解决方案是将"环境"改为L"环境".(我以为在发布这个问题之前我已经尝试过了,但显然我没有正确地尝试过!)但是任何想要完成这个任务的完整C++解决方案的人都应该看看Dan Molding的答案.
在Ruby中通过标识比较两个对象的保证方法是什么?给定两个变量,如果变量指向内存中完全相同的对象,我想返回true.
对于大多数Ruby对象,该equal?方法按身份进行比较:
f = g = Object.new
p f.equal? g # => true
Run Code Online (Sandbox Code Playgroud)
但是,这不适用于所有对象.例如:
class F
def ==(obj) false end
def ===(obj) false end
def eql?(obj) false end
def equal?(obj) false end
def object_id; self end
end
f = g = F.new
p f == g # => false
p f === g # => false
p f.eql? g # => false
p f.equal? g # => false
p f.object_id == g.object_id # => false
Run Code Online (Sandbox Code Playgroud)
什么是通过身份比较两个对象的万无一失的保证方法?
这是一个纯粹的智力问题.任何以"为什么"开头的问题的答案都可能是"因为我很好奇".