链接 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.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;
我正在开发一个程序,该程序将打开默认邮件客户端以发送带有附件的邮件。我在 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.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;