HOWTO: Create an Organizational Forms Library Programmatically
ID: Q194976
|
The information in this article applies to:
-
Extended Messaging Application Programming Interface (MAPI), version 1.0
-
Exchange Development Kit (EDK), versions 5.0, 5.5
SUMMARY
When deploying forms for Microsoft Exchange in a worldwide organization, it
may be necessary to create several Organizational Forms Libraries in
different languages much like the administrator program does. This is done
using the MAPI function CreateFolder(). However, it is necessary to have
very special privileges to get it to work. These special privileges can
only be obtained by opening the store with an EntryId created using
CreateStoreEntryID().
MORE INFORMATION
The sample code in this article does the following:
- Opens the message store with a standard pointer.
- Makes a call to CreateStoreEntryID() requesting special permissions.
- Closes the message store.
- Reopens the message store with the special EntryID obtained in #2 above.
Once you have the pointer with the correct permissions, you can use it for
standard calls such as CreateFolder(), SetProps(), and SaveChanges().
The additional libraries required to compile and link this Win32
application sample are as follows:
- msvcrt.lib
- edkguid.lib
- addrlkup.lib
- version.lib
- edkutils.lib
- edkdebug.lib
- edkmapi.lib
- mapi32.lib
- ACLCLS.LIB
You will need to modify the code marked by "TO DO" to reference the
appropriate Exchange Organization, Site and Server Name. You will also need
to be logged into the Windows NT machine under a domain account that has
permissions on the Exchange Server's Organization, Site and Configuration
objects:
#include <edk.h>
LPMAPISESSION lpMapiSession = NULL;
LPMDB lpPubStore = NULL;
LPMAPIFOLDER lpPublicFolder1 = NULL,
lpFormFolder = NULL;
LPMAPITABLE lpContentTable = NULL;
LPSRowSet lpRows = NULL;
ULONG rCount = 0, i = 0;
HRESULT hr;
MAPIINIT_0 MapiInit;
char lngName[100];
static SizedSPropTagArray( 2L, PropFolderName) =
{ 2L, {PR_DISPLAY_NAME,0x3fe90003}};
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE,
LPSTR pszCmd, int nCmdShow)
{
MapiInit.ulVersion = 0;
MapiInit.ulFlags = MAPI_NT_SERVICE;
hr = MAPIInitialize( &MapiInit);
if (!HR_SUCCEEDED(hr))
{
MessageBox(0l,"MAPIInitialize error","Error",MB_OK);
return -1;
}
hr = MAPILogonEx( 0, (LPTSTR)NULL, (LPTSTR)"",
MAPI_NEW_SESSION | MAPI_EXTENDED | MAPI_LOGON_UI,
&lpMapiSession);
if (!HR_SUCCEEDED(hr))
{
MessageBox(0l,"MAPILogonEx error","Error",MB_OK);
return -1;
}
hr = HrOpenExchangePublicStore( lpMapiSession, &lpPubStore);
if (!HR_SUCCEEDED(hr))
{
MessageBox(0l,"HrOpenExchangePublicStore error","Error",MB_OK);
return -1;
}
LPEXCHANGEMANAGESTORE pManageStore = NULL;
ULONG cbeid;
LPENTRYID lpeid = NULL;
char szServerDN[500];
ULONG ulFlags;
ulFlags = LOGOFF_PURGE;
hr = lpPubStore->QueryInterface(IID_IExchangeManageStore,
(LPVOID *) &pManageStore);
if (hr != SUCCESS_SUCCESS)
{
lpPubStore->StoreLogoff(&ulFlags);
MessageBox(0,"QueryInterface error","Error",MB_OK);
return -1;
}
// TO DO: Create Server DN
sprintf(szServerDN, "/o=%s", "MyOrganization");
sprintf(szServerDN, "%s/ou=%s",szServerDN, "MySite");
sprintf(szServerDN, "%s/cn=Configuration/cn=Servers/cn=%s",
szServerDN, "MyServer");
sprintf(szServerDN, "%s/cn=Microsoft Public MDB",szServerDN);
if (FAILED(hr = pManageStore->CreateStoreEntryID(szServerDN, NULL,
OPENSTORE_USE_ADMIN_PRIVILEGE | OPENSTORE_PUBLIC |
OPENSTORE_TAKE_OWNERSHIP | OPENSTORE_HOME_LOGON,
&cbeid, &lpeid)))
{
MessageBox(0l,"CreateStoreEntyrID error","Error",MB_OK);
return - 1;
}
ulFlags = LOGOFF_PURGE;
hr = lpPubStore->StoreLogoff(&ulFlags);
if (hr != SUCCESS_SUCCESS)
{
MessageBox(0l,"StoreLogoff error","Error",MB_OK);
return -1;
}
if (FAILED(hr = lpMapiSession->OpenMsgStore(0L, cbeid, lpeid,
NULL, MAPI_DEFERRED_ERRORS | MDB_WRITE,
&lpPubStore)))
{
MessageBox(0l,"OpenMsgStore error","Error",MB_OK);
return -1;
}
// Property value: "Registries" subtree EID
SPropValue *pvalFR_EID = NULL;
ULONG ul;
SPropTagArray tagaFR_EID = { 1,
{ PR_EFORMS_REGISTRY_ENTRYID } };
hr = lpPubStore -> GetProps (&tagaFR_EID, fMapiUnicode,
&ul, &pvalFR_EID);
if (! HR_SUCCEEDED (hr))
{
printf("GetProps error \n");
return -1;
}
// Open the Registries subtree. The registry folder should be
// created under this subtree.
hr = lpPubStore -> OpenEntry (pvalFR_EID -> Value.bin.cb,
(LPENTRYID) pvalFR_EID -> Value.bin.lpb,
NULL, MAPI_MODIFY, & ul,
(LPUNKNOWN *) & lpPublicFolder1);
if (! HR_SUCCEEDED (hr))
{
printf("OpenEntry error \n");
return -1;
}
hr = lpPublicFolder1->CreateFolder(FOLDER_GENERIC,
"TestFormLibrary", NULL, NULL,
OPEN_IF_EXISTS | MAPI_DEFERRED_ERRORS,
&lpFormFolder);
if (!HR_SUCCEEDED(hr))
{
MessageBox(0l,"CreateFolder error","Error",MB_OK);
return -1;
}
SPropValue lpPropValueArray2[3];
lpPropValueArray2[0].ulPropTag = PR_EFORMS_LOCALE_ID;
lpPropValueArray2[0].Value.ul =
MAKELCID (MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_EIRE),
SORT_DEFAULT);
lpPropValueArray2[1].ulPropTag = PR_DISPLAY_NAME;
lpPropValueArray2[1].Value.LPSZ = "Forms Library (English-Irish)";
lpPropValueArray2[2].ulPropTag = PR_PUBLISH_IN_ADDRESS_BOOK;
lpPropValueArray2[2].Value.b = FALSE;
if (FAILED(hr = lpFormFolder->SetProps(3,lpPropValueArray2,NULL)))
{
MessageBox(0l,"Setprops error","Error",MB_OK);
return -1;
}
if (FAILED(hr = lpFormFolder->SaveChanges(KEEP_OPEN_READWRITE)))
{
MessageBox(0l,"SaveChanges error","Error",MB_OK);
return -1;
}
if (lpMapiSession)
{
lpMapiSession->Logoff(0, 0, 0);
ULRELEASE(lpMapiSession);
}
MAPIUninitialize();
return 0 ;
}
Additional query words:
Keywords : kbMsg kbEDK550 kbMAPI100
Version : WINDOWS:1.0,5.0,5.5
Platform : WINDOWS
Issue type : kbhowto