2015-10-27 6 views
1

Im работает над программой, которая должна открыть почтовый клиент по умолчанию для отправки сообщения с вложением. Я нахожусь на Windows x64 (8.1), используя VS2012, здание для x64. Я решил правильно использовать MAPISendMailW.Ссылка на MAPISendMailW?

Я добавил MAPI32.lib в настройках проекта (Linker->AdditionalDependencies), а также здания с /VERBOSE:LIB показывает, что он пытается найти MAPISendMailW в MAPI32.lib. Тем не менее я получаю

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

Итак, наконец, я проверил содержание MAPI32.lib через

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

и - о, хорошо - нет MAPISendMailW.

Что мне нужно сделать, чтобы использовать MAPISendMailW?

ответ

1

Я пробовал это с VS2k10 (Ultimate) и VS2k13 (Ultimate). В первом он не компилируется, поскольку его нет в MAPI.h, в то время как в последнем include-файл даже не присутствует.

Как вы прошли мимо фазы компиляции? Вы определили заголовок функции? Поскольку мне кажется странным, что определение функции в VS2k12 включает файлы, но не в соответствующие файлы lib.

Установите Windows 8 SDK на компьютер, на котором вы пытаетесь создать приложение.

Или, вы можете попробовать альтернативу, динамической загрузки (во время выполнения) функцию MAPISendMailW от mapi32.dll (и больше не полагаться на 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; 
+0

Спасибо у ou - Win8SDK, но я уже работаю над Win10. Тем не менее: он берет заголовки и библиотеку импорта непосредственно из Win8SDK. Я также считаю это очень странным, поэтому я думаю, что лучшим вариантом будет 'LoadLibrary/GetProcAddress'. – St0fF

+0

P.S .: см. 'C: \ Program Files (x86) \ Windows Kits \ 8.0 \ Include \ um \ MAPI.h' в http://pastebin.com/kqUfMUB8 - Строка 139ff: объявление структуры; Строки 263ff: определение закрытия, определение типа, объявление функции – St0fF

+1

Я установил W8SDK. После просмотра [MSDN doc] (https://msdn.microsoft.com/en-us/library/hh802867 (v = vs.85) .aspx) (нет файла .lib, упомянутого в разделе _Requirements_), а также в в файле заголовка я заметил, что функция определена как указатель (точно так же, как я ее определил), поэтому его можно использовать таким образом. Итак, включите 'MAPI.h' для всего определения, тогда' MAPI32.lib' не требуется (по крайней мере для этого func), но вместо этого используйте динамическую загрузку. – CristiFati