链接 MAPISendMailW?

Linking MAPISendMailW?

我正在开发一个程序,该程序将打开默认邮件客户端以发送带有附件的邮件。我在 Windows x64 (8.1),使用 VS2012,为 x64 构建。我认为正确的方法是使用 MAPISendMailW.

我在项目设置 (Linker->AdditionalDependencies) 中添加了 MAPI32.lib,并且使用 /VERBOSE:LIB 进行构建显示,它试图在 MAPI32.lib 中找到 MAPISendMailW .我还是明白了

error LNK2019: unresolved external symbol MAPISendMailW referenced in function ...

所以最后我通过

检查了MAPI32.lib的内容

dumpbin.exe -headers MAPI32.lib >> to_some_textfile.txt

而且 - 哦,好吧 - 没有 MAPISendMailW.

我需要做什么才能使用 MAPISendMailW

我用 VS2k10(Ultimate) 和 VS2k13(Ultimate) 试过了。在前者中,它不会编译,因为它不存在于 MAPI.h 中,而在后者中,包含文件甚至不存在。

那么您是如何通过编译阶段的呢?您是否定义了函数头?因为我觉得很奇怪,函数定义在VS2k12的include文件中,而在相应的lib文件中却没有。

在您尝试构建应用程序的计算机上安装 Windows 8 SDK

或者,您可以尝试另一种方法,动态加载(在运行时)来自 mapi32.dllMAPISendMailW 函数(并且不再依赖 MAPI.hMAPI32.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;