小编Spa*_*ott的帖子

为什么这个UNION像一个结构体?

我遇到了一些具有联合的代码(它位于 Microchip 的库中)。

一切都很好,直到我看到它为联盟的不同成员依次分配了。我的第一反应是“他们正在写相同的位置......”然后我决定做一个测试。根据我认为我理解的每一种衡量标准,这个联合应该是一个字节(8 位)。但它不是...它是 4 个字节。

#pragma pack(1)
typedef union _STATUS
{
    BYTE Val;
    struct {
        unsigned BC8 : 1;
        unsigned BC9 : 1;
        unsigned BSTALL : 1;
        unsigned DTSEN : 1; 
        unsigned INCDIS : 1;
        unsigned KEN : 1;   
        unsigned DTS : 1;   
        unsigned UOWN : 1;  
    };
    struct {
        unsigned BC8 : 1;
        unsigned BC9 : 1;
        unsigned PID0 : 1;
        unsigned PID1 : 1;
        unsigned PID2 : 1;
        unsigned PID3 : 1;
        unsigned : …
Run Code Online (Sandbox Code Playgroud)

c struct unions

7
推荐指数
2
解决办法
568
查看次数

OPENSSL与公共服务器的连接提供X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY

我正在编写一个非常基本的SSL客户端来连接到HTTPS Web服务器.我可以很好地连接和处理请求/响应.但OpenSSL正在报告UNABLE_TO_GET_ISSUER_CERT_LOCALLY,但到目前为止我选择忽略错误:-).现在我想解决这部分问题.

我正在测试通过连接到HTTPS上的公共SSL服务器,例如Google或Yahoo,并检查返回SSL_get_verify_result(...).

据我了解,我需要该特定站点的CA pem文件,以便OpenSSL可以验证链到可信证书颁发机构.在这种情况下,这将是签署Google或Yahoo证书的权威机构.

为了获得我期望的PEM文件,我打开了我的FireFox,导航到这些网站,并执行了一个查看证书并将每个文件导出到列表中.例如,我有一个名为"GeoTrustGlobalCA.pem"的文件,看起来都不错.事实上,当我直接访问GeoTrust站点并下载他们的根证书时,它与我从FireFox导出的证书相同,正如我所料.

因此,例如Google在FireFox中的树中显示了两个证书,我将每个证书加载到:

result = SSL_CTX_load_verify_locations(ctx,"GoogleInternetAuthorityG2.pem",NULL);
if (result == 0) {
    puts("Opps...  Can't load the certificate");
}

result = SSL_CTX_load_verify_locations(ctx,"GeoTrustGlobalCA.pem",NULL);
if (result == 0) {
    puts("Opps...  Can't load the certificate");
}
Run Code Online (Sandbox Code Playgroud)

在那之后,通常的东西连接和沟通:

BIO_set_conn_hostname(bio, "www.google.com:https");
Run Code Online (Sandbox Code Playgroud)

加载或连接时不会出错.

但是,验证不起作用.

result = SSL_get_verify_result(ssl);
printf("The Verify Result is %d \n",result);
Run Code Online (Sandbox Code Playgroud)

我得到了回报UNABLE_TO_GET_ISSUER_CERT_LOCALLY (error code 20).

那么,我在这里错过了一些概念吗?这不会给我X509_V_OK结果,因为它有可靠的证书吗?google.com上只有两个链接,我使用它们.

ssl openssl certificate

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

如何将数组从 COM 传递回 Visual Basic?

这应该很简单。但我没有找到解决方案。也许是因为它太老了(VB和COM)

我试图将一个小整数数组(或者甚至只是字节,就像我在这个问题的示例中尝试过的那样)返回一个 COM 注册的进程内 DLL,使用 ATL 用 C 编写,到 VB6 应用程序。

我确实找到了很多关于走另一条路的信息。

据我了解,VARIANT 是解决方案,因为只需将一个基于 C 的数组传递回 VB 应用程序就必须进行编组,并且需要知道其大小。

我的优势在于我正在开发 COM 对象,并针对 VB 应用程序对其进行测试。虽然我的VB技能几乎为零。

许多其他调用按预期工作,将数据发送到 COM DLL,并从 COM DLL 中获取整数或 BSTR,并在 VB 中使用它们。但是,这个原始值数组不起作用。

首先我以为我没有正确编码VB,因为我对VB知之甚少。然后我想一定是C代码没有正确创建VARIANT数组。现在我不知道该怎么想。

我的结果是 VB 中的调用返回,并且 VB Watch 窗口显示 VARIANT 但没有内容(字面意思是空白,没有描述为“空”或“空”或任何内容)。(为什么 VB 坚持将变量的第一个字母大写,谁也说不准……)

在此输入图像描述

当我尝试从 VARINAT 访问索引时,它因索引越界而失败。

我尝试“ReDim”它,并得到更多变体,都说“空”。但至少他们确实告诉我“空”。

因此,从 DLL 返回的 VARIANT 中似乎没有任何内容。

我已经从 OLE 标头尝试了几个 VT_,要么得到空的 VARIANT,要么得到“不支持自动化类型”的错误。

COM 服务器中的 C++ 代码如下(已清理以供发布)。我尝试过 VT_UI1、VT_UI4、VT_INT 和其他几种类型:

STDMETHODIMP CClass::getArrayData(VARIANT* pVal, long *result) {
    unsigned char arry[4];
    unsigned long count;
    unsigned char *pData;
    arry[0] = …
Run Code Online (Sandbox Code Playgroud)

arrays vb6 com

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

g ++ strstr表示从const char*到char*的无效转换

我正在转换用C++编写的用于Windows的项目.一切都很顺利(这意味着我清楚地看到需要改变哪些东西才能使C++成为正确的东西),直到我点击这个,这是我在关键字=值对的字符串中找到关键字的常规方法:

bool GetParameter(const char * haystack, const char *needle) {
    char *search, *start;
    int len;
    len = strlen(needle) + 4;     //  make my own copy so I can upper case it...
    search = (char *) calloc(1,len);
    if (search == NULL) return false;
    strcpy(search,needle);
    strupr(search);
    strcat(search,"=");           //  now it is 'KEYWORD='
    start = strstr(haystack,search);  <---- ERROR from compiler
Run Code Online (Sandbox Code Playgroud)

g ++告诉我"从const char*到char*的转换无效"(投诉的确切位置是参数变量'search')

但似乎g ++是阅读障碍的.因为我实际上正在走另一条路.我将char*传递给const char*

(所以转换是"从char*到const char*")

strstr原型是char*strstr(const char*,const char*)

这里没有危险.任何const char*都没有被修改.
为什么告诉我这个?我该怎么办才能修复它?

谢谢你的帮助.

c++ string

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

从 IWICBitmapSource、IWICBitmap、IWICBitmapDecoder 获取位图 BitsPerPixel(无论在何处)

我想主题已经说明了一切。但在一些细节上,我正在加载、操作、然后显示位图,并且是在 GDI 中完成的。现在我想增加一些速度,因为它反复发生。

许多年前,我将 DirectX 用于其他用途,但我所看到的一切都表明要摆脱 DirectX,转向 Direct2D。所以是时候扔掉所有这些知识并重新开始了。真正的 MS 方式;-)

好吧,为了操作位图,在进行渲染之前,我发现可以使用“Lock()”来获取它。界面上的功能也会告诉我尺寸。但我还需要了解 BBP,并跨步。

在有人说“你为什么不使用 ::GetBBP()... DUH”之前,经过数小时的 MSDN 和其他来源搜索后,我一直无法远程找到类似的东西。还有很多非常令人困惑的 COM 接口。

我唯一能找到的是 GetPixelFormat(),它返回一个 GUID,然后我编写大约 150 个“if (...)”语句来比较它。这样我就可以测试它的三个值,如果不是其中一个值则拒绝(1,8,32),这几乎不是处理这个问题的有效方法。

GetPixelFormat() 也不告诉我步幅。

有没有办法做到这一点?

(位图也是未压缩的,所以我什至不需要通过 IWICBitmapDecoder 运行它们,但我还没有弄清楚如何简单地告诉 IWICBitmap“这是一个 blob,将其用作大小为 xy 的位图”)

感谢您的任何帮助。

-斯科特

bitmap directdraw direct2d

2
推荐指数
1
解决办法
2354
查看次数

在 C# 中 FTP 多个文件而无需重新建立连接

FTP 协议旨在支持控制通道,并使用该控制通道告诉服务器打开 TCP 连接并传输文件。

发送或接收文件的服务器不必与 FTP 控制通道连接到的服务器相同。它可以是“三角形”类型的连接。

它还允许客户端在控制通道上登录一次,并反复告诉服务器传输文件,而无需重新登录控制通道。

显然,当他们创建 C#FtpWebRequest类时,这个概念已经完全脱离了 MS 。

我需要完全按照 FTP 协议的设计目的来做:

  1. 连接到服务器

  2. 传入凭据

  3. 创建目录(并愉快地忽略“已存在”错误)

  4. 重复传输文件到服务器

  5. 退出控制通道

我肯定没有在FtpWebRequest课堂上看到这种能力。或者任何看起来允许在 C# 代码中进行这种流程的东西。

我看过:

但这一切似乎都不允许以它应该的方式进行控制。

我可以指定KeepAlive属性,但循环必须重复调用该WebRequest.Create(targetName);函数,这将创建一个新连接,并获得一个新响应。然后它们超出范围或成为孤儿,因此根据定义,它们将被销毁。因此连接必须关闭,然后必须重新打开。对于数据连接,这没问题,但是操作 CONTROL 端口的能力在哪里?

正如 FTP 规范定义的那样,该类不允许用户区分 CONTROL 端口和 DATA 端口。

有没有办法使用 C# 类按照它的意图来执行 FTP?因为在微软狭隘的思维中,整个世界看起来就像一个 HTTP Get/Response 协议。

任何建议表示赞赏。

-斯科蒂

.net c# ftp ftpwebrequest

2
推荐指数
1
解决办法
3810
查看次数

标签 统计

.net ×1

arrays ×1

bitmap ×1

c ×1

c# ×1

c++ ×1

certificate ×1

com ×1

direct2d ×1

directdraw ×1

ftp ×1

ftpwebrequest ×1

openssl ×1

ssl ×1

string ×1

struct ×1

unions ×1

vb6 ×1