链接MAPISendMailW?
我正在开发一个程序,该程序将打开默认邮件客户端发送带附件的邮件。我在Windows x64 (8.1)
,使用VS2012
,建筑x64
。我认为正确的方法是使用MAPISendMailW
。链接MAPISendMailW?
我加MAPI32.lib
项目设置(Linker->AdditionalDependencies
),和建筑/VERBOSE:LIB
表明,它试图找到MAPI32.lib
MAPISendMailW
。不过我得到
error LNK2019: unresolved external symbol MAPISendMailW referenced in function ...
所以最后我通过
dumpbin.exe -headers MAPI32.lib >> to_some_textfile.txt
,并检查MAPI32.lib的内容 - 哦,很好 - 没有MAPISendMailW
。
我该怎么做才能使用MAPISendMailW
?
我试过VS2k10(Ultimate)和VS2k13(Ultimate)。在前者中,由于它在MAPI.h
中不存在,所以不编译,而在后者中,包含文件甚至不存在。
那么你是如何在编辑阶段过去的?你定义了函数头吗?因为我觉得奇怪的是函数定义在VS2k12包含文件中,但不在相应的lib文件中。
在您尝试构建应用程序的计算机上安装Windows 8 SDK。
或者,你可以尝试替代方案中,mapi32.dll
动态加载(在运行时)的MAPISendMailW
功能(而不再依靠MAPI.h
和MAPI32.lib
)使用LoadLibrary/GetProcAddress,但最有可能你必须定义附加的东西(像lpMapiMessageW
结构)除了函数指针定义:
typedef ULONG (WINAPI *MAPISendMailWPtr)(_In_ LHANDLE lhSession, _In_ ULONG_PTR lUIParam, _In_ lpMapiMessageW lpMessage, _In_ FLAGS flFlags, ULONG ulReserved);
@ EDIT1:附加一些示例代码:
#include <Windows.h>
#include <MAPI.h>
// Some lines of code
HMODULE mapi32Dll = NULL;
LPMAPISENDMAILW MAPISendMailWPtr = NULL;
if ((mapi32Dll = LoadLibrary("mapi32.dll")) == NULL) {
printf("Error %d loading lib\n", GetLastError());
return 0;
}
if ((MAPISendMailWPtr = (LPMAPISENDMAILW)GetProcAddress(mapi32Dll, "MAPISendMailW")) == NULL) {
printf("Error %d loading func\n", GetLastError());
FreeLibrary(mapi32Dll);
return 0;
}
//ULONG result = MAPISendMailWPtr(....)
// Some more lines of code
FreeLibrary(mapi32Dll);
return 0;
谢谢ÿ ou - Win8SDK已安装,但我实际上已经在使用Win10。仍然:它直接从Win8SDK获取标题和导入库。 我也觉得很奇怪,所以我猜我最好的选择是'LoadLibrary/GetProcAddress'。 – St0fF
P.S .:参见http://pastebin.com/kqUfMUB8上的C:\ Program Files文件(x86)\ Windows Kits \ 8.0 \ Include \ um \ MAPI.h' - 行139ff:结构声明;第263ff行:闭包定义,类型定义,函数声明 – St0fF
我已经安装了W8SDK。查看[MSDN文档](https://msdn.microsoft.com/en-us/library/hh802867(v = vs.85).aspx)(在_Requirements_部分中没有提及.lib文件),并且在头文件我注意到函数被定义为一个指针(就像我定义的那样),所以这是用这种方式。因此,为所有定义包含'MAPI.h',然后'MAPI32.lib'不是必需的(至少对于这个func),而是使用动态加载。 – CristiFati