我的代码面临链接器错误.我试图用Win-7 X64位m/c中的Visual Studio命令Prompt(2010)进行编译.我看到的错误如下.
dust2.obj
dust2.obj:错误LNK2019:函数_main中引用的未解析的外部符号_NtOpenFile @ 24
dust2.obj:错误LNK2019: 函数_main中引用的未解析的外部符号_RtlAnsiStringToUnicodeStr ing @ 12
dust2.obj:错误LNK2019:未解析的外部符号_RtlInitAnsiString @ 8在函数_main中引用
dust2.exe:致命错误LNK1120:3个未解析的外部
我的代码的简化版本是这样的:
#include <windows.h>
#include <iostream>
#include <Winternl.h>
using namespace std;
int main()
{
NTSTATUS Status;
OBJECT_ATTRIBUTES Obja;
HANDLE SourceFile;
PUNICODE_STRING PathName=0;
PANSI_STRING p_path=0;
const char* ccp_path = "D:\\txt.txt";
RtlInitAnsiString( p_path,ccp_path );
RtlAnsiStringToUnicodeString( PathName, p_path, true );
IO_STATUS_BLOCK IoStatusBlock;
wprintf(L"%s", PathName->Buffer);
InitializeObjectAttributes(
&Obja,
PathName,
OBJ_CASE_INSENSITIVE,
NULL,
NULL
);
Status = NtOpenFile(
&SourceFile,
FILE_LIST_DIRECTORY | FILE_READ_EA | FILE_READ_ATTRIBUTES,
&Obja,
&IoStatusBlock,
FILE_SHARE_READ | FILE_SHARE_WRITE, …Run Code Online (Sandbox Code Playgroud) 目前我正面临一个问题,我将缓冲区对象从x64 arch传递到x86 arch.该对象还包含一些指针值,在x64中为8个字节,x86上的相同指针大小为4个字节.现在,当我通过管道传输对象时,它的大小比x86平台对同一对象所期望的要多一些(因为这里的指针大小较小).我可以从这个论坛中的类似帖子中了解到我可能需要使用序列化,但我不知道我以前从未使用过序列化.序列化会解决这个问题吗?我正在使用C++与GCC编译器.我希望该产品适用于所有拱门(ia64,x64或x86).
我们可以有一个函数指针指向一个使用变量参数列表的函数吗?例如,假设我需要根据某些输入T'输入'在多个函数中选择一个函数.我可以使用像这样的STL地图吗?
template<typename T>
map<T, T (*)(T, ...)> func_map;
Run Code Online (Sandbox Code Playgroud)
如果这是可能的,你可以告诉我这样做是正确的设计观点.
[编辑]其实我有一套算法函数,我有一个消息字段.我需要根据此消息上的几个字节值选择此算法函数.我正在考虑使用hash_map,其键值是指向该算法函数的指针.我希望按照性能非常快,实现这一点的方法是什么.
另外,我没有为此选择简单的if-else或switch块的原因是因为告诉我们需要执行的函数的值可以在稍后的某个时候引用其他函数.
{注意}:Visual Studio Dos支持.ipp文件.这里的问题是手动效率低而不是技术性.
在C++项目中,几乎没有.ipp扩展文件.在Visual C++ 2008中进行编译时,我看到了一些链接器错误"LNK2019: unresolved external symbol".我想,对于某些对象文件链接器无法链接在.ipp文件下实现的少数功能.我在项目中包含了.ipp文件(之前它们没有),但仍然是同一个问题.
我的问题是visual C++ 2008不支持.ipp文件吗?如果它确实是解决这些链接器错误的正确方法.
编辑1:我发现这个链接应该提供一个解决方法,使*.ipp适用于Visual C++.但是,我正在使用Visual C++ 2008,并且看到注册表路径没有"Languages\File Extensions"字段,就像此链接所说的那样.
我在C中定义了一个像这样的宏:
#define SOME_FIELD(_A_,_B_,_C_) \
MyObj[ ## _A_ ## ].somePTR = \
(DWORD_PTR) (buff_ ## _C_ ## _C_ ## _ ## _B_ ## );
Run Code Online (Sandbox Code Playgroud)
我能理解的是,对于索引A,我们得到了一些"somePTR"的值.我的问题是,有什么## <name> ##表示法,以及如何计算somePTR的值?
我是这样一个宏的新手,所以描述性的解释会非常有用.
c++ ×5
c ×2
visual-c++ ×2
boost ×1
named-pipes ×1
networking ×1
pipe ×1
pointers ×1
stl ×1
winapi ×1