小编Jam*_*ton的帖子

列表中的空白行在Redmine

这看起来非常简单,但我无法弄清楚.我想在我的Redmine项目维基中列出这样的列表:

  1. 真的很复杂的项目

    第3行

  2. 下一个复杂的项目

基本上,我想在列表中有空行而不重新编号.我该怎么做呢?这看起来很基本; 我无法相信他们没有想到这一点 - 我必须遗漏一些明显的东西.

wiki textile redmine

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

什么是REBASE.EXE的替代品?

我需要重新设置我用我的程序安装的DLL文件组,因为它是一个32位程序,地址空间现在太碎片了.还有一个问题是,由于基地址与某些DLL冲突,整个DLL在冷启动时被请求分页到RAM中,因此加载器可以对它们进行重新绑定.有些DLL是我们编译过的; 其他人来自第三方.

我想要做的是有一个工具rebase一组给定的DLL,以便DLL组占用一个连续的内存块.然后,在编译安装程序之前运行此工具,并将重新定义的DLL安装在应用程序的专用目录中.

据我所知,Windows SDK附带的REBASE.EXE工具确实做到了这一点.给它一些DLL,然后重新定义它们.

不幸的是... Windows 8 Consumer Preview的Windows软件开发工具包(SDK)说:

工具许多已过时或已弃用的工具已从Windows SDK中删除.已删除以下工具:

<snip> ReBase.exe

现在怎么办?我不想开始使用明显过时的工具,并且将在下一版本的Windows中消失.假设我正在读这个,那么使用ReBase.exe有什么替代品?我想限制自己使用Windows SDK和/或Visual Studio附带的工具,而不是引入第三方工具和/或编写我自己的rebase代码.

或者,我是否以错误的方式处理整个问题?

windows dll winapi rebase visual-c++

10
推荐指数
1
解决办法
8663
查看次数

如何在给定设备实例ID的情况下可靠,快速地获取网卡的MAC地址

给定网卡的设备实例ID,我想知道它的MAC地址.集成Intel千兆卡的系统上的设备实例ID示例:

PCI\VEN_8086&DEV_10CC&SUBSYS_00008086&REV_00\3&33FD14CA&0&C8
Run Code Online (Sandbox Code Playgroud)

到目前为止,我使用的算法的工作原理如下:

  1. 打电话SetupDiGetClassDevsDIGCF_DEVICEINTERFACE.
  2. 调用SetupDiEnumDeviceInfo以获取返回的设备SP_DEVINFO_DATA.
  3. 调用SetupDiEnumDeviceInterfacesGUID_NDIS_LAN_CLASS得到一个设备接口.
  4. 调用SetupDiGetDeviceInterfaceDetail此返回的设备接口.这使我们将设备路径作为字符串: \\?\pci#ven_8086&dev_10cc&subsys_00008086&rev_00#3&33fd14ca&0&c8#{ad498944-762f-11d0-8dcb-00c04fc3358c}\{28fd5409-15bd-4c06-b62f-004d3a06f852}
  5. 此时我们有一个网卡驱动程序接口的地址.CreateFile使用#4的结果打开它.
  6. DeviceIoControl使用IOCTL_NDIS_QUERY_GLOBAL_STATS和OID 调用OID_802_3_PERMANENT_ADDRESS以获取MAC地址.

这通常有效,并已在相当多的机器上成功使用.但是,似乎很少有机器的网络驱动程序DeviceIoControl在步骤#6 中没有对请求做出正确响应; 即使将网卡驱动程序更新到最新版本后问题仍然存在.这些是较新的基于Windows 7的计算机.具体来说,DeviceIoControl成功完成,但返回零字节而不是包含MAC地址的预期六个字节.

一条线索似乎在MSDN页面上IOCTL_NDIS_QUERY_GLOBAL_STATS:

此IOCTL将在以后的操作系统版本中弃用.您应该使用WMI接口来查询微型端口驱动程序信息.有关更多信息,请参阅NDIS对WMI的支持.

- 也许更新的网卡驱动程序不再实现这个IOCTL?

那么,我应该怎么做呢?是否有可能在我的方法中存在疏忽并且我做了一些稍微错误的事情?或者我需要采取更加不同的方法吗?一些替代方法似乎包括:

  • 查询Win32_NetworkAdapterWMI类:提供所需信息但由于性能糟糕而被拒绝.请参阅Win32_NetworkAdapter WMI类的快速替换以获取本地计算机的MAC地址
  • 查询MSNdis_EthernetPermanentAddressWMI类:似乎是WMI的替代品,IOCTL_NDIS_QUERY_GLOBAL_STATS并直接从驱动程序查询OID - 这个工作在麻烦的网络驱动程序上.不幸的是,返回的类实例只提供MAC地址和InstanceName,这是一个本地化的字符串Intel(R) 82567LM-2 Gigabit Network Connection.查询MSNdis_EnumerateAdapter产生其涉及的一个列表InstanceNameDeviceName,像\DEVICE\{28FD5409-15BD-4C06-B62F-004D3A06F852}.我不知道如何从DeviceName即插即用设备实例ID(PCI\VEN_8086...... …

c++ windows wmi networking device-instance-id

9
推荐指数
1
解决办法
6014
查看次数

在不使用参数化查询的情况下,在避免SQL注入风险的同时,在SQL WHERE子句中包含数据的最安全的方法是什么?

什么是一个很好的函数用于使字符串安全包含在SQL查询中?例如,需要修复撇号,并且无疑也可能出现其他问题.我想要一个坚如磐石的功能,如果任何可能的输入,邪恶的行为者可以设计它.

现在,在群众告诉我使用查询参数和/或downvote/close这个问题之前,请考虑以下几点:

  • 我被困在使用设计糟糕的API的第三方库.应该按如下方式调用API:

    dataObjectVariable.FindWhere("WHERE RecordID = '(your string here)'");
    
    Run Code Online (Sandbox Code Playgroud)

    现在,我同意你100%认为这不是一个好的API,因为它(1)向用户公开内部数据库字段名称是实现细节,(2)没有机会使用参数来避免这个问题地方,(3)实际上,你可以说SQL本身是一个实现细节,不应该暴露.但是我坚持使用这个API,因为它需要与其行业中的一个领先系统集成.我们也无法让他们改变他们的API.

  • 我在这个网站上搜索了与此问题有关的其他问题,但发现答案往往强烈建议参数化查询.试图建议编写一个函数来清理字符串的答案经常被低估,没有经过深思熟虑等等 - 我不确定我是否相信它们.

我只搜索字符串,而不是其他数据类型,如数字,日期等.再次,我100%意识到使用参数化查询的好处,我希望我可以使用它们,但我不能因为我的手与此相关.

c# sql

9
推荐指数
1
解决办法
200
查看次数

如何有效地使用git存储库/子模块用于具有许多依赖关系的C++产品?

我对Git很新,还在搞清楚......我想我终于理解了整个分支/合并方面.但我仍然不确定处理项目依赖性的最佳解决方案是什么.什么是最佳做法?这必须是一个常见问题,但我找不到一个好的教程或最佳实践.

假设我有一个依赖于其他几个C++库的C++产品,最终构成了一个复杂的依赖图.图书馆如:其他内部开发的C++库,公共开源库,现成的闭源库

最终的C++产品的源代码依赖于其依赖项的输出以进行编译.这些产出包括:

  • 一系列C++头文件(注意C++实现文件不存在)
  • 一组已编译的二进制文件(LIB文件,DLL文件,EXE文件等)

我的理解是我应该将每个库都放在自己的存储库中.然后听起来像Git的子模块主要是我们正在寻找的.写了在http://chrisjean.com/2009/04/20/git-submodules-adding-using-removing-and-updating/特别是似乎是一个很好的介绍,我可以几乎了解.例如,我可以将我的主项目存储库引用到特定的外部Git存储库作为子模块/依赖项.C++代码可以在相应的子模块目录中"#include"头文件.主产品/存储库中包含的构建脚本可以设想继续递归编译所有子模块.

好了,现在问题是:

您通常如何缓存每个存储库的二进制文件?我们的一些依赖项需要数小时才能编译,并且不会经常更新.通过上面的方案,我可以从服务器克隆/检查一个高级项目来修复一个小bug.据我了解,我也被迫克隆构成这些开源依赖项的所有数千个文件 - 我担心这可能需要一些时间(特别是在Windows上).更糟糕的是,我不会被强制重新编译每个子模块,即使几个月没有人改变过这个子模块吗?(似乎每个开发人员计算机上的某种本地"哈希表"方案将变更集ID链接到一组已编译的二进制文件将会很方便...)

(我之前在几年前工作过的一家商店使用的是Mercurial - 但是所有代码 - 内部项目等等都被整合到一个巨大的巨型存储库中,你必须在一个巨大的单片构建脚本中构建所有东西.从服务器克隆新创建的分支.当我们完成修复/新功能并与上游合并时,我们删除了该特定分支的本地存储库.)

我们正在Windows上进行开发,但最终将分支到其他非Microsoft平台 - 因此可移植性非常重要.

c++ windows git version-control

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

WaitNamedPipe的重叠I/O替代方法是什么?

WaitNamedPipe功能允许管道客户端应用程序同步等待命名管道服务器上的可用连接.然后调用CreateFile以打开管道作为客户端.伪代码:

// loop works around race condition with WaitNamedPipe and CreateFile
HANDLE hPipe;
while (true) {
    if (WaitNamedPipe says connection is ready) {
        hPipe = CreateFile(...);
        if (hPipe ok or last error is NOT pipe busy) {
            break; // hPipe is valid or last error is set
        }
    } else {
        break; // WaitNamedPipe failed
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是这些都是阻塞的同步调用.异步执行此操作的好方法是什么?例如,我似乎无法找到使用重叠I/O执行此操作的API.例如,对于管道服务器,ConnectNamedPipe函数提供lpOverlapped允许服务器异步等待客户端的参数.然后,管道服务器可以调用WaitForMultipleObjects并等待I/O操作完成,或等待发出任何其他事件(例如,一个事件表示线程取消挂起的I/O并终止).

我能想到的唯一方法是WaitNamedPipe使用短暂的有限超时调用循环,并检查其他信号是否超时.或者,在循环调用中CreateFile,检查其他信号,然后Sleep使用短延迟(或WaitNamedPipe)进行呼叫.例如:

HANDLE …
Run Code Online (Sandbox Code Playgroud)

c c++ windows named-pipes

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

如果 Git 子模块移动到另一台服务器怎么办?

我正在将我们产品的源代码组织到一堆不同的 Git 存储库中。(而且我是 Git 的新手)。其中一些将通过子模块使用同一服务器上的其他存储库。

据我了解,Git 中的子模块是指向另一个存储库中特定提交的指针,其定义如下:

  • 远程子模块的 URL(例如 git://foo.com/git/lib.git)
  • 将子模块的存储库克隆到的子目录(例如 include/foo)
  • 我们引用的提交 ID

问题是当添加子模块时,一个 URL 作为提交的一部分存储在存储库中。如果 URL 更改会发生什么?父存储库可能有数百个提交——所有提交都带有一个引用旧 URL 的子模块。

例如,假设我将存储库 Super 和 Sub 存储在 git://PrivateCompanyServer/repositories/* 中。Super 通过其 gitmodules 文件引用 Sub:git://PrivateCompanyServer/repositories/Sub.git。一些开发人员对 Super 进行了数百次提交——几乎 Super 中的每个提交都有一个包含该 URL 的 gitmodules 快照。几个产品版本被标记,各种分支在 gitmodules 中都有 URL。现在,假设 PrivateCompanyServer 崩溃,我们将代码移动到另一台服务器。或者我们重新组织 PrivateCompanyServer 上的目录结构。管他呢。现在我们在 Super 中有数百个提交,这些提交引用了不再存在的旧 URL 上的 Sub 存储库。显然,gitmodules 文件可以在 development 分支的头部进行更正,我们可以继续前进。但是由于维护原因,我们可能不得不返回各种旧提交,并且它们都将引用不再起作用的旧 URL。怎么处理?

显然,这可以通过变基/“重写历史记录”来解决,以便存储库中的所有 gitmodules 文件都有新的 URL,但我认为这不是一个选项,因为 Super 中的几乎每个提交都会获得一个新的提交 ID。引用 Super 的所有内容,包括使用 Super 作为子模块的“Super-Super”项目和本地开发人员存储库都会中断 - 对吗?

那么处理这个问题的最佳方法是什么? 如果您在私人公司服务器上存储一组存储库 - 其中一些通过子模块引用其他存储库 - 当服务器更改名称时您会怎么做 - 因此使 gitmodules 文件中的旧 …

git

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

LNK4099链接器警告,干净安装Qt SDK和Visual C++ 2008

是否在新的Windows 7计算机上进行了全新安装:

  • Visual Studio 2008 SP1
  • Qt SDK 1.1.4

然后我在Qt Creator中创建了一个新项目.我在"Qt Widget Project"下选择了"Qt Gui Application",并使用Visual C++ 2008定位桌面,包括调试和发布(基本上都是默认设置).

然后我按下Build,然后......

qtmaind.lib(qtmain_win.obj):-1: warning: LNK4099: PDB 'vc90.pdb' was not
found with 'c:\QtSDK\Desktop\Qt\4.7.4\msvc2008\lib\qtmaind.lib' or at
'C:\Users\JamesJ\Desktop\QtTest-build-desktop-Qt_4_7_4_for_Desktop_-
_MSVC2008__Qt_SDK__Debug\debug\vc90.pdb'; linking object as if no debug info
Run Code Online (Sandbox Code Playgroud)

我必须遗漏一些明显的东西 - 当然,Qt的开箱即用体验不应该涉及编译器/链接器警告吗?!?!

如何解决此链接器警告?我更喜欢将警告视为错误,所以......我想解决这个问题.

c++ windows qt qt4 qt-creator

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

通过EM_FORMATRANGE缩放富编辑控件的渲染输出时的舍入错误

我正在使用该EM_FORMATRANGE消息将富文本控件的输出呈现给任意设备上下文.但是,当渲染到位图时,位图的设备上下文的每英寸点数与显示设备的DPI相同,即每英寸96点.这比我想呈现的要低得多.我宁愿渲染更高的DPI,以便用户可以放大,也许以后可以在高DPI打印机上打印.

我怀疑会发生什么情况是,RTF控件调用GetDeviceCapsLOGPIXELSXLOGPIXELSY获取装置的每英寸的像素数.然后,它使用此DPI值以100%缩放级别呈现文档.除非在系统上使用大字体(在控制面板中设置)并且应用程序支持DPI,否则Windows显示设备始终返回96 DPI的值.

互联网上的许多例子都建议扩大产量EM_FORMATRANGE.这样可以实现任何任意的DPI分辨率.大多数示例通常涉及使用SetMapMode,, SetWindowExtExSetViewportExtEx(例如,请参阅http://social.msdn.microsoft.com/Forums/en-us/netfxbcl/thread/37fd1bfb-f07b-421d-9b5e-5f4492ffbbc3).这些函数可用于缩放富文本控件的渲染输出:例如,如果我指定400%缩放,那么如果富文本控件呈现5像素宽的内容,则实际上将变为20像素宽.

不幸的是,旧的GDI函数使用整数而不是浮点数.例如,假设RTF控件决定应在(12.7,15.3)像素处绘制元素.这将四舍五入到(13,15)的位置.这些圆角坐标传递给GDI,GDI然后使用以下指定的缩放比例放大图像SetMapMode:对于400%的示例,它将是(13*4,15*4)或(52,60).但这不准确:元素最好放在(12.7*4,15.3*4)或(51,61).最糟糕的是,在某些情况下,错误会累积起来.

我相信这是缩放一些简单文本时这个非常明显的错误的根本原因:

使用EM_FORMATRANGE <code>EM_FORMATRANGE</code>和<code>SetMapMode</code>在96 DPI显示设备上下文缩放到400%.文本现在变成了32磅大小,但每个角色之间的空间太高,看起来不自然.</p>

<p><img rel=

上面的示例是在写字板中创建的,输入文本为8点Segoe UI,然后使用缩放控件设置为400%缩放级别.每个角色之间的空间看起来很正常.使用32磅字体和100%缩放级别可获得完全相同的结果.

要解决此问题,我尝试了以下方法.对于尝试的每一件事,当缩放到400%时,结果同样不令人满意.

  • 使用缩放变换使用设置SetWorldTransform,而不是与完成缩放SetMapModeSetWindowExtEx等.
  • 将元文件的设备上下文传递给EM_FORMATRANGE,然后稍后缩放元文件.
  • 使用SetMapMode结合比例与呈现为图元文件,再后来表示无调整图元文件.

我相信结果总是不能令人满意,因为问题归结为这样一个事实:富编辑控件正在四舍五入到最接近的整数并呈现它认为是96 DPI设备 - 忽略转换到位.我查看了元文件格式,我发现的是单个字符位置实际上以像素级分辨率存储在元文件中 - 这就是为什么缩放元文件显然不起作用,因为该点已经发生舍入.

我可以想到两个可以解决这个问题的真正解决方案:

  • 使用具有更高用户指定的每英寸点数的设备上下文,以GetDeviceCaps返回不同的值.(注意:一些示例建议使用打印机设备,因为它们通常具有更高的DPI,但我希望我的代码可以在没有打印机并且能够渲染到屏幕外缓冲区的系统上工作).
  • 某种方式告诉富编辑控件假设设备上下文的每英寸点数与报告的不同GetDeviceCaps.

其他任何东西似乎仍然会受到这些舍入误差的影响.

有没有人(1)知道如何实现我提出的任何解决方案,或者(2)如何实现我的目标,即将准确的高DPI输出放入缓冲区?

c c++ windows winapi richtextbox

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

为什么RAD Studio Seattle 10会安装Windows 10 SDK?(它是否适用于较新的SDK?)

在C++ Builder Seattle 10 Update 1安装结束时,Embarcadero的主要设置启动了一个名为Microsoft Windows 10 SDK Installer的附加嵌入式安装程序.这就是它的样子,万一你忘记了:

在此输入图像描述

然后,此安装程序开始安装原始RTM Windows 10 SDK,如下所示:

在此输入图像描述

为什么C++ Builder会安装它?C++ Builder如何与SDK链接 - 它究竟使用了什么?如果我安装一个较新的Windows SDK(例如2015年11月发布的那个),它会起作用吗?(很难想象如何,因为在IDE中设置所有内容以使用文件C:\Program Files (x86)\Embarcadero\Studio\17.0\include\windows\sdk,这些文件包括Embarcadero对SDK所做的更改,例如特殊的bcc32 pragma语句.)

我已经分析了RAD Studio的安装文件,试图弄清楚发生了什么,但我没有一个很好的答案为什么他们正在做他们做的事情:

  • 在RAD Studio ISO上,检查7-Zip中的``\ Install\Setup.exe`.
  • 有一个setup.res文件; 打开里面的7-Zip也.
  • 在里面setup.res你会发现MSSDKInstall.exe你在上面第一个截图中看到的内容.在7-Zip内打开它.
  • 然后,您将看到几个文件:
    • MSSDKInstall.msi:如果你用Orca打开它,你会发现这是一个非常简单的安装程序,它将一些蓝牙头文件安装到Embarcadero include目录中.
    • OFFLINE目录:包含显然使用了微星8个不同的Windows SDK头文件:BluetoothAPIs.h,bluetoothleapis.h,bthdef.h,bthledef.h,bthsdpdef.h,no_sal2.h,winapifamily.h,ws2bth.h.

另外看来,这个单独的安装程序与主要的RAD Studio安装程序冲突.主安装程序还会安装这些相同的头文件.然后运行此安装程序,并替换这些文件.然后它出于某种未知原因启动官方Microsoft Windows 10 SDK安装程序.如果卸载Embarcadero SDK安装程序包,则会完全删除这8个头文件(因此会发生冲突).

所以:(1)为什么他们不在主安装中只包含那8个头文件 - 这一切的重点是什么,(2)为什么他们启动官方的Microsoft Windows 10 …

delphi c++builder delphi-10-seattle

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