245 lines
4.4 KiB
C
245 lines
4.4 KiB
C
#include <stdio.h>
|
||
#include <stdlib.h>
|
||
#include <windows.h>
|
||
#include <string.h>
|
||
#include <mapi.h>
|
||
|
||
#define Assert(cond) { \
|
||
if (! (cond)) { \
|
||
printf("Error on line: %d\n", __LINE__); \
|
||
exit(-1); \
|
||
} \
|
||
}
|
||
|
||
#define Error(arg) printf arg
|
||
#define ErrorExit(arg) { printf arg; exit(-1); }
|
||
|
||
//
|
||
// Global variables used for accessing MAPI services
|
||
//
|
||
|
||
static HINSTANCE hLibMapi = NULL;
|
||
ULONG lhMapiSession = 0;
|
||
LPMAPILOGON lpfnMAPILogon = NULL;
|
||
LPMAPILOGOFF lpfnMAPILogoff = NULL;
|
||
LPMAPIADDRESS lpfnMAPIAddress = NULL;
|
||
LPMAPIFREEBUFFER lpfnMAPIFreeBuffer = NULL;
|
||
|
||
//
|
||
// Global variables used for accessing MAPI services
|
||
//
|
||
|
||
static HINSTANCE hLibMAPI = NULL;
|
||
|
||
|
||
|
||
BOOL
|
||
InitMapiServices(
|
||
VOID
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Initialize Simple MAPI services if necessary
|
||
|
||
Arguments:
|
||
|
||
NONE
|
||
|
||
Return Value:
|
||
|
||
TRUE if successful, FALSE otherwise
|
||
|
||
--*/
|
||
|
||
{
|
||
//
|
||
// Load MAPI32.DLL into memory if necessary
|
||
//
|
||
|
||
if (hLibMapi == NULL && (hLibMapi = LoadLibrary(TEXT("MAPI32.DLL")))) {
|
||
|
||
//
|
||
// Get pointers to various Simple MAPI functions
|
||
//
|
||
|
||
lpfnMAPILogon = (LPMAPILOGON) GetProcAddress(hLibMapi, "MAPILogon");
|
||
lpfnMAPILogoff = (LPMAPILOGOFF) GetProcAddress(hLibMapi, "MAPILogoff");
|
||
lpfnMAPIAddress = (LPMAPIADDRESS) GetProcAddress(hLibMapi, "MAPIAddress");
|
||
lpfnMAPIFreeBuffer = (LPMAPIFREEBUFFER) GetProcAddress(hLibMapi, "MAPIFreeBuffer");
|
||
|
||
if (!lpfnMAPILogon || !lpfnMAPILogoff || !lpfnMAPIAddress || !lpfnMAPIFreeBuffer) {
|
||
|
||
//
|
||
// Clean up properly in case of error
|
||
//
|
||
|
||
FreeLibrary(hLibMapi);
|
||
hLibMapi = NULL;
|
||
}
|
||
}
|
||
|
||
return hLibMapi != NULL;
|
||
}
|
||
|
||
|
||
|
||
VOID
|
||
DeinitMapiServices(
|
||
VOID
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Deinitialize Simple MAPI services if necessary
|
||
|
||
Arguments:
|
||
|
||
NONE
|
||
|
||
Return Value:
|
||
|
||
NONE
|
||
|
||
--*/
|
||
|
||
{
|
||
if (hLibMapi) {
|
||
|
||
|
||
if (lhMapiSession)
|
||
lpfnMAPILogoff(lhMapiSession, 0, 0, 0);
|
||
|
||
lhMapiSession = 0;
|
||
FreeLibrary(hLibMapi);
|
||
hLibMapi = NULL;
|
||
}
|
||
}
|
||
|
||
|
||
|
||
VOID
|
||
DoMapiLogon(
|
||
HWND hDlg
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Logon MAPI to in order to access address book
|
||
|
||
Arguments:
|
||
|
||
hDlg - Handle to the fax recipient wizard page
|
||
|
||
Return Value:
|
||
|
||
NONE
|
||
|
||
Note:
|
||
|
||
_TODO_
|
||
MAPI is not Unicoded enabled on NT!!!
|
||
Must revisit this code once that's fixed.
|
||
|
||
--*/
|
||
|
||
{
|
||
//
|
||
// Check if we're already logged on to MAPI
|
||
//
|
||
|
||
|
||
if (lpfnMAPILogon(0,
|
||
"davidx",
|
||
NULL,
|
||
MAPI_LOGON_UI,
|
||
0,
|
||
&lhMapiSession) != SUCCESS_SUCCESS)
|
||
{
|
||
Error(("MAPI logon failed\n"));
|
||
lhMapiSession = 0;
|
||
}
|
||
}
|
||
|
||
|
||
|
||
VOID
|
||
DoAddressBook(
|
||
VOID
|
||
)
|
||
|
||
{
|
||
lpMapiRecipDesc pNewRecips;
|
||
ULONG nNewRecips, recipIndex;
|
||
LONG status;
|
||
|
||
//
|
||
// Initialize MAPI services
|
||
//
|
||
|
||
if (! InitMapiServices()) {
|
||
|
||
Error(("InitMapiServices failed\n"));
|
||
return;
|
||
}
|
||
|
||
//
|
||
// Logon to MAPI
|
||
//
|
||
|
||
DoMapiLogon(NULL);
|
||
|
||
//
|
||
// Present the address dialog
|
||
//
|
||
|
||
status = lpfnMAPIAddress(lhMapiSession, 0, NULL, 1, NULL, 0, NULL,
|
||
MAPI_LOGON_UI, 0, &nNewRecips, &pNewRecips);
|
||
|
||
if (status != SUCCESS_SUCCESS) {
|
||
|
||
Error(("MAPIAddress failed: %d\n", status));
|
||
return;
|
||
}
|
||
|
||
//
|
||
// Dump out each selected recipient
|
||
//
|
||
|
||
for (recipIndex=0; recipIndex < nNewRecips; recipIndex++) {
|
||
|
||
printf("Name: %s, Address: %s\n",
|
||
pNewRecips[recipIndex].lpszName,
|
||
pNewRecips[recipIndex].lpszAddress);
|
||
}
|
||
|
||
if (pNewRecips)
|
||
lpfnMAPIFreeBuffer(pNewRecips);
|
||
}
|
||
|
||
INT _cdecl
|
||
main(
|
||
INT argc,
|
||
CHAR **argv
|
||
)
|
||
|
||
{
|
||
INT buffer[1024], index;
|
||
|
||
for (index=0; index < 1024; index++)
|
||
buffer[index] = index ^ 0x12345678;
|
||
|
||
DoAddressBook();
|
||
DeinitMapiServices();
|
||
|
||
for (index=0; index < 1024; index++)
|
||
Assert(buffer[index] == (index ^ 0x12345678));
|
||
return 0;
|
||
}
|