我遇到了一些具有联合的代码(它位于 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) 我正在编写一个非常基本的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上只有两个链接,我使用它们.
这应该很简单。但我没有找到解决方案。也许是因为它太老了(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) 我正在转换用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*都没有被修改.
为什么告诉我这个?我该怎么办才能修复它?
谢谢你的帮助.
我想主题已经说明了一切。但在一些细节上,我正在加载、操作、然后显示位图,并且是在 GDI 中完成的。现在我想增加一些速度,因为它反复发生。
许多年前,我将 DirectX 用于其他用途,但我所看到的一切都表明要摆脱 DirectX,转向 Direct2D。所以是时候扔掉所有这些知识并重新开始了。真正的 MS 方式;-)
好吧,为了操作位图,在进行渲染之前,我发现可以使用“Lock()”来获取它。界面上的功能也会告诉我尺寸。但我还需要了解 BBP,并跨步。
在有人说“你为什么不使用 ::GetBBP()... DUH”之前,经过数小时的 MSDN 和其他来源搜索后,我一直无法远程找到类似的东西。还有很多非常令人困惑的 COM 接口。
我唯一能找到的是 GetPixelFormat(),它返回一个 GUID,然后我编写大约 150 个“if (...)”语句来比较它。这样我就可以测试它的三个值,如果不是其中一个值则拒绝(1,8,32),这几乎不是处理这个问题的有效方法。
GetPixelFormat() 也不告诉我步幅。
有没有办法做到这一点?
(位图也是未压缩的,所以我什至不需要通过 IWICBitmapDecoder 运行它们,但我还没有弄清楚如何简单地告诉 IWICBitmap“这是一个 blob,将其用作大小为 xy 的位图”)
感谢您的任何帮助。
-斯科特
FTP 协议旨在支持控制通道,并使用该控制通道告诉服务器打开 TCP 连接并传输文件。
发送或接收文件的服务器不必与 FTP 控制通道连接到的服务器相同。它可以是“三角形”类型的连接。
它还允许客户端在控制通道上登录一次,并反复告诉服务器传输文件,而无需重新登录控制通道。
显然,当他们创建 C#FtpWebRequest
类时,这个概念已经完全脱离了 MS 。
我需要完全按照 FTP 协议的设计目的来做:
连接到服务器
传入凭据
创建目录(并愉快地忽略“已存在”错误)
重复传输文件到服务器
退出控制通道
我肯定没有在FtpWebRequest
课堂上看到这种能力。或者任何看起来允许在 C# 代码中进行这种流程的东西。
我看过:
和别的。
但这一切似乎都不允许以它应该的方式进行控制。
我可以指定KeepAlive
属性,但循环必须重复调用该WebRequest.Create(targetName);
函数,这将创建一个新连接,并获得一个新响应。然后它们超出范围或成为孤儿,因此根据定义,它们将被销毁。因此连接必须关闭,然后必须重新打开。对于数据连接,这没问题,但是操作 CONTROL 端口的能力在哪里?
正如 FTP 规范定义的那样,该类不允许用户区分 CONTROL 端口和 DATA 端口。
有没有办法使用 C# 类按照它的意图来执行 FTP?因为在微软狭隘的思维中,整个世界看起来就像一个 HTTP Get/Response 协议。
任何建议表示赞赏。
-斯科蒂