ID: Q165931
The information in this article applies to:
Creating a custom recipient programmatically requires the use of the DAPI functions. Using DAPIStart to create a DAPI session is the first step to making this work. Once the session is created, use DAPIWrite to send the custom recipient information to the Exchange Server.
This example is not a complete program. It assumes that MAPIInitialize has been called. The additional include files required to make this code work are Dapi.h and Edk.h.
1. Populate the DAPIParms structure. This structure must be created in
order to call DAPIStart:
sDAPIParms.pszDSAName = "EXCHANGE_SERVER";
sDAPIParms.pszBasePoint = NULL;
sDAPIParms.pszContainer = NULL;
sDAPIParms.pszNTDomain = "EXCHANGE_SERVER";
sDAPIParms.dwFlags = DAPI_MODIFY_REPLACE_PROPERTIES;
sDAPIParms.dwDAPISignature = DAPI_SIGNATURE;
2. Create a DAPI session using the DAPIStart function. Check the value
returned to make sure you have a DAPI session created:
pDAPIEvent = DAPIStart(
&hDAPISession,
&sDAPIParms);
if (pDAPIEvent != NULL)
goto cleanup;
3. Allocate memory for the DAPI_ENTRY structure that will store the custom
recipient information. Check for the success of the memory allocation
and clear the memory:
hr = MAPIAllocateBuffer(sizeof(DAPI_ENTRY), (LPVOID*) &pValues);
if (FAILED(hr))
{
goto cleanup;
}
ZeroMemory(pValues, sizeof(DAPI_ENTRY));
4. Allocate memory for the DAPI_ENTRY structure that will store the header
information for the recipient properties. Check for the success of the
memory allocation and clear the memory:
hr = MAPIAllocateBuffer(sizeof(DAPI_ENTRY), (LPVOID*) &pAttributes);
if (FAILED(hr))
{
goto cleanup;
}
ZeroMemory(pAttributes, sizeof(DAPI_ENTRY));
5. Set the attributes to set for the custom recipient. The memory is
cleared and then the values are set:
pAttributes->unAttributes = 1;
pAttributes->ulEvalTag = TEXT_LINE;
hr = MAPIAllocateMore(
cDAPIArrayElements * sizeof(ATT_VALUE),
pAttributes,
(LPVOID*) &pAttributes->rgEntryValues);
if (FAILED(hr))
{
goto cleanup;
}
ZeroMemory(
pAttributes->rgEntryValues,
cDAPIArrayElements * sizeof(ATT_VALUE));
pAttributes->rgEntryValues[0].DapiType = DAPI_TEXT;
pAttributes->rgEntryValues[0].Value.pszValue = "Obj-Class,
E-mail address,Directory Name,Alias Name,obj-container,
Display name,First Name,Last Name";
pAttributes->rgEntryValues[0].size =
strlen(pAttributes->rgEntryValues[0].Value.pszValue);
6. Fill the DAPI_ENTRY structure with the values to create the custom
recipient:
pValues->unAttributes = 1;
pValues->ulEvalTag = TEXT_LINE;
hr = MAPIAllocateMore(
cDAPIArrayElements * sizeof(ATT_VALUE),
pValues,
(LPVOID*) &pValues->rgEntryValues);
if (FAILED(hr))
{
goto cleanup;
}
ZeroMemory(
pValues->rgEntryValues,
cDAPIArrayElements * sizeof(ATT_VALUE));
pValues->rgEntryValues[0].DapiType = DAPI_TEXT;
pValues->rgEntryValues[0].Value.pszValue =
"Remote,SMTP:USER1@cate.com,usertest,usertest,Recipients,
User Test,User,Test";
pValues->rgEntryValues[0].size =
strlen(pValues->rgEntryValues[0].Value.pszValue);
7. Write the data to the Exchange directory. To determine if the write
was successful, check the value of DAPIEvent and the USN:
ulNewUSN = 0;
pDAPIEvent = DAPIWrite(
hDAPISession,
dwWriteFlags,
pAttributes,
pValues,
&ulNewUSN,
NULL,
NULL);
8. Release the memory allocated to the DAPI_ENTRY structures:
MAPIFREEBUFFER(pValues);
MAPIFREEBUFFER(pAttributes);
9. End the DAPI session:
DAPIEnd(hDAPISession);
NOTE: This example can run from a machine other than an Exchange Server. In
order to accomplish this, the following DLLs must be present on the
machine: Dapi.dll, Exchmem.dll, and Libxds.dll. If errors referring to the
$first name$ occur when trying to run the code, install the Exchange
Administrator on the machine and the errors should disappear.
Keywords : kbcode kbAPI kbEDK kbMsg
Version : 1.0
Platform : WINDOWS
Issue type : kbhowto
Last Reviewed: July 11, 1998