小编Rya*_*ies的帖子

用VS7编写的C程序使用Win7/8/2008R2/2012,但不是2003/XP/32bit?

我必须首先说我是一个编程菜鸟.我不了解IDE的所有编译器选项或细微差别,而不是远视.但我正在尝试更多地了解本机编程语言.(我对C#很体面,但是这比我发现的容易得多.)

今天,我用C编写了这个小程序.它是一个控制台/命令行程序.我使用Visual Studio 2012,我的开发机器在Windows 7和8,64位之间交替使用.首先,我所做的是创建一个新的VC++项目,然后我选择了一个空白项目.然后我创建了一个新的app.c文件.我还创建了一个*.rc文件,当您在Windows资源管理器中浏览文件属性时,为可执行文件提供一些额外的属性,如"文件版本"和"公司名称".然后我去了项目的属性,选择了配置属性 - > C/C++ - >代码生成,我将运行时库更改为"多线程(/ MT),这样我就不必分发msvcr100.dll文件了以及我的可执行文件.

在app.c文件中,我放置了以下代码:

#include <stdio.h>
#include <string.h>
#include <Windows.h>
#include <WtsApi32.h>
#pragma comment(lib, "WtsApi32.lib")

void main(int argc, char *argv[])
{
    char *helpMsg = "blah";
    char *hostName, *connState = "";
    char *addrFamily = "";
    HANDLE hHost = NULL;

    ...stuff and so forth and so on...
}
Run Code Online (Sandbox Code Playgroud)

然后我构建/编译了程序,并且可执行文件在Windows 7,8,Server 2008R2,Server 2012,所有64位上运行正常.但是,当我尝试在Server 2003上运行该程序时(我也在猜WinXP等),我接受了Windows对话框:

"Foo.exe不是有效的Win32应用程序."

所以我的问题是,是否有一些显而易见/简单的东西我将丢失,这将允许这个可执行文件也可以在我错过的早期XP/2003/32bit平台上运行?我不相信我在我的程序中使用任何64位独占功能.但我认为,因为我选择"空白项目"而不是"Win32控制台应用程序",我可能会错过一些设置.

编辑:这是针对我的exe运行时的dumpbin.exe/headers输出:

Microsoft (R) COFF/PE Dumper Version 11.00.50727.1
Copyright (C) Microsoft Corporation.  All rights reserved.


Dump of file …
Run Code Online (Sandbox Code Playgroud)

c visual-c++

10
推荐指数
2
解决办法
5549
查看次数

MSVC Address Sanitizer - 有什么理由在发布版本中使用它?

Microsoft 最近将 Address Sanitizer (ASan) 引入了 Microsoft Visual Studio 2019,我一直在尝试它。这个问题特定于 C 和 C++。我的问题是:是否有任何理由为发布版本启用 ASan,而不是仅为调试版本启用它?打开 ASan 对我的程序的性能和内存使用量来说是毁灭性的。(CPU 性能比减半还要差,内存使用量增加了两倍。)因此,我希望如果我启用 ASan 只是为了检查潜在问题,并且它在调试版本中没有检测到任何问题,那么我可以放心地假设不会有发布版本中是否存在任何可能被 ASan 发现的问题?当然,我们不打算在发布/生产版本中启用 ASan 吗?

感谢您的任何见解。

c c++ windows address-sanitizer msvc12

7
推荐指数
1
解决办法
1952
查看次数

X位计算机如何使用2X位数?

这不是我第一次遇到这个问题,但今天我在玩SNES游戏的时候又想起了这个游戏,想要找到比我更了解它的人的回答.

以超级任天堂为例.这是一个16位系统.使用16位,最多可以计数65536或2 ^ 16.那么机器如何应对我,例如,得分大于65536?

computer-science

6
推荐指数
1
解决办法
128
查看次数

如何在C#证书回调中查看“签名哈希算法”?

我有一台使用以下证书进行SSL / TLS通信的服务器:

证书查看器

在我的C#代码中,我使用自定义证书验证回调以编程方式查看此证书的属性,如下所示:

private static bool CertificateValidationCallBack(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
    // Certificate2 is better than Certificate1, right?
    X509Certificate2 cert = (X509Certificate2)certificate;            

    Console.WriteLine("Certificate Subject   : " + cert.Subject);
    Console.WriteLine("Certificate Issuer    : " + cert.Issuer);
    // So on and so forth...
}
Run Code Online (Sandbox Code Playgroud)

但是,我的问题是我似乎看不到“签名哈希算法”属性。cert.SignatureAlgorithm.FriendlyName返回RSASSA-PSS,并且

new System.Security.Cryptography.Oid(cert.GetKeyAlgorithm()).FriendlyName)

简单地返回RSA。这些属性似乎都不给我在GUI中看到的“ sha256”属性。如何退还该财产?

编辑:我在Cryptography.SE上发现了一个相关问题,问题说明Microsoft的证书查看器GUI有点不合标准,但如果是这样的话,我也想不合要求。我想知道如何以与GUI相同的方式报告“ sha256”。

更新08/13:从另一个角度来看,当我使用命令时

certutil.exe -dump cert.cer
Run Code Online (Sandbox Code Playgroud)

结果摘录:

Signature Algorithm:
    Algorithm ObjectId: 1.2.840.113549.1.1.10 RSASSA-PSS
    Algorithm Parameters:
    0000  30 34 a0 …
Run Code Online (Sandbox Code Playgroud)

.net c# ssl-certificate x509certificate2

5
推荐指数
1
解决办法
2238
查看次数

显式声明函数指针而不是数据指针

我正在使用Microsoft Visual Studio将程序从C++转换为C. 这是一个Windows应用程序,但我认为这与此问题无关.

我正在使用/W4开关打开更多警告信息.我想我的程序编译没有警告.该程序编译并运行正常.这只是警告信息.

在程序是C++之前,它编译时没有任何警告,但是现在我已经尽可能地将它转换为C,这是一个警告,我不知道如何处理.

这是相关的代码.我的想法是我正在为GUI创建一个菜单系统.每个菜单都包含一组菜单项,每个菜单项都包含一个函数指针,表示用户选择该菜单项时将执行的操作.

typedef struct MENUITEM
{
    wchar_t* Name;
    void*    Action;
} MENUITEM;

typedef struct MENU
{
    wchar_t*   Name;
    uint8_t    SelectedItem;
    uint8_t    ItemCount;
    MENUITEM** Items;
} MENU;
Run Code Online (Sandbox Code Playgroud)

在程序的其他地方,这是在用户选择菜单项时处理事件的代码:

void(*FP) (void) = NULL;
FP = (void(*)())MyMenu.Items[MyMenu.SelectedItem]->Action;
FP();
Run Code Online (Sandbox Code Playgroud)

以下是生成的编译器警告:

C4152非标准扩展,表达式中的函数/数据指针转换

C4113'void(__ cdecl*)()'参数列表与'void(__ cdecl*)(void)'不同

警告消息C4152 的MSDN文档指出:

函数指针转换为数据指针或从数据指针转换.在Microsoft扩展(/ Ze)下允许此转换,但在ANSI C下不允许.

好的,所以我认为这解释了为什么它没有像C++那样产生警告,但是当编译成C时,它确实如此.但我不知道如何处理它.说实话,我之前没有意识到函数指针和数据指针之间存在差异.

我无法弄清楚如何更改我的函数指针的声明,以便编译器明确指出这是一个函数指针,而不是数据指针.

c function-pointers visual-c++

5
推荐指数
2
解决办法
661
查看次数

String.Split带字符串?

我有一个非常简单的问题.

我想做一个经典String.Split(),但有一个字符串,而不是一个字符.喜欢string.Split("word")和回到一个阵列,就像我做的那样string.Split('x').

.net c#

4
推荐指数
1
解决办法
178
查看次数

C#使用关键字的范围

据我所知,每当我实例化一个实现IDisposable的类时,我都应该使用该using关键字以确保它被正确处理掉.

像这样:

using (SecureString s = new SecureString())
{

}
Run Code Online (Sandbox Code Playgroud)

以上内容对我来说很容易理解 - 我可以s在这些括号内使用但是一旦我离开这些括号,我就再也不能参考了s.范围很容易看到.

但我不明白的是当你使用using没有封闭括号时它是如何工作的.

private void Function()
{
    // Some code here

    using (SecureString s = new SecureString())

    // more code here
}
Run Code Online (Sandbox Code Playgroud)

你根本不需要使用括号...所以...如果using关键字没有括号,我怎么知道我能在哪里使用这个对象以及它在哪里处理?

c# using-statement

4
推荐指数
2
解决办法
339
查看次数

让Outlook识别我的数字签名电子邮件

我正在使用C#.NET 4.0发送签名的SMTP邮件,如下所示:

    private void SendMailMessage(object data)
    {
        MailMessage message = new MailMessage();
        message.From = new MailAddress(fromAddress);
        message.To.Add(new MailAddress(emailTo));
        message.Subject = "Subject";
        message.IsBodyHtml = true;
        message.Body += "Blah blah blah.";
        byte[] messageBytes = Encoding.ASCII.GetBytes(message.Body);
        SignedCms Cms = new SignedCms(new ContentInfo(messageBytes));
        CmsSigner Signer = new CmsSigner(SubjectIdentifierType.IssuerAndSerialNumber, certificate);
        Cms.ComputeSignature(Signer);
        byte[] SignedBytes = Cms.Encode();
        MemoryStream signedStream = new MemoryStream(SignedBytes);
        AlternateView signedView = new AlternateView(signedStream, "application/pkcs7-mime; smime-type=signed-data;name=sig.p7m");
        message.AlternateViews.Add(signedView);
        SmtpClient client = new SmtpClient(smtpServer, int.Parse(smtpServerPort));
        client.DeliveryMethod = SmtpDeliveryMethod.Network;
        client.Send(message);
        message.Dispose();
        client = null;       
    }
Run Code Online (Sandbox Code Playgroud)

据我所知,这"工作",如果查看消息的原始数据,我会看到备用视图中有一个大的PKCS签名.但Outlook不承认它.Outlook客户端通常会识别已签名的邮件并尝试验证它们,并在邮件上放置一些证书以及所有这些...

我想要那......我错过了什么? …

.net c# outlook

3
推荐指数
1
解决办法
1078
查看次数

更快地释放注册表句柄

C#3.5,Windows 7+

以下面的代码为例:

using (RegistryKey regKey = Registry.Users.OpenSubKey(regKeyString, true))
{
    if (polRegKey.GetValue("Foo") == null)
        polRegKey.CreateSubKey("Foo");
}
Run Code Online (Sandbox Code Playgroud)

现在假设我每秒都在循环中执行此代码.

然后,当我使用Process Explorer查看正在运行的进程时,我看到的是生成该注册表项的新句柄,但未及时销毁.相反,我看到的是每秒创建一个新句柄,然后在大约20秒之后,几乎所有句柄的大块同时被破坏.这是我期望从垃圾收集器那种行为.我认为C#的using语句自动处理对象我错了吗?它似乎是以一种非常懒惰的方式做到的,如果它实际上是在做它的话.

c# windows resources

3
推荐指数
1
解决办法
178
查看次数

在延迟时将鼠标光标隐藏在客户区?

我正在用C编写Windows应用程序.

我通过处理WM_SETCURSOR消息将鼠标光标隐藏在窗口的客户区域中:

    case WM_SETCURSOR:
    {
        static BOOL HideCursor = FALSE;
        if ((LOWORD(LParam) == HTCLIENT) && !HideCursor)
        {
            HideCursor = TRUE;
            ShowCursor(FALSE);
        }
        else if ((LOWORD(LParam) != HTCLIENT) && HideCursor)
        {
            HideCursor = FALSE;
            ShowCursor(TRUE);
        }
        Result = DefWindowProc(Window, Message, WParam, LParam);
        break;
    }
Run Code Online (Sandbox Code Playgroud)

这很好用,但它有点尴尬,因为鼠标光标一进入窗口的客户区就会立即消失.例如,当用户试图将光标移向工具栏按钮或手动调整窗口大小时,用户可以很容易地忘记鼠标光标"应该"的位置.

如何在那里添加一个或两个延迟,以便用户可以将鼠标移动到窗口的客户区域而鼠标不会立即消失,但是如果鼠标光标在客户区域中悬停超过一秒或两秒钟,它消失了?

c winapi user-experience

3
推荐指数
1
解决办法
239
查看次数