Send attachment without MAPI controls

I am doing this in Access 97.  I am attempting to send and receive MAPI messages with attached files and cannot get SIMPLE MAPI go do it.  I believe SIMPLE MAPI cannot.  I have tried with the msmapi32.ocx control but cannot get this to distribute to the client PC so I have given up.

Is there any other method of using attachments in MAPI without the msmapi32.ocx control.  Also, my cilents are using Exchange and not Outlook so I don't think Outlook Automation will work.


Bonus Question: How can I find out the default MAPI profile for a use so that I don't need to ask them the first time they use the application?  It must be possible since forcing the profile dialog to appear has the default profile as the default selection in the dialog's combo box.

Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.


Regarding the OCX issue.  I noticed that you made another post about difficulties that you are experiencing in distributing your application.  Once you have resolved that problem, you will find that the msmapi32.ocx problem should go away.

There are alternatives to using msmapi.  In addition to third-party controls (such as Quiksoft's EasyMail, et. al.), you can program directly to the MAPI API layer.  However, I don't recommend it.  It takes a lot of work, is not well documented, and I am not even sure if you can do it directly from Access.  The OCX is there for a reason :)

You can determine the default MAPI profile by reading the registry.  
In NT, this information is found at HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\DefaultProfile"

In 95, it's at HKEY_CURRENT_USER\Software\Microsoft\Windows Messaging Subsystem\Profiles\DefaultProfile"

Hope this helps!

kfenskeAuthor Commented:
I have two questions concerning your helpful answer:
1. Do you know if there might be a licensing issue I'm running into?  I once got a message to that effect during testing but can't find any info on a file or registry entry to add for the license.

2. Thanks for the profile info, could you tell me how to read the registry from Access Basic?

I'm not sure what might be causing the license problem.  It only came up once, you say?

As for the registry, Access 97 Basic is actually a subset of Visual Basic.  Therefore, the following code should work.  You might have to play with it a little to get it to work in Access...

Put the following code in its own code module:
Option Explicit

Private Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Private Declare Function RegQueryValueExStr Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, ByVal lpData As String, lpcbData As Long) As Long
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Private Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Private Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName As String) As Long
Private Declare Function RegSetValueExStr Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, ByVal lpData As String, ByVal cbData As Long) As Long
Private Declare Function RegFlushKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Private Const HKEY_CURRENT_USER = &H80000001
Private Const HKEY_LOCAL_MACHINE = &H80000002
Private Const REG_SZ = 1
Private Const ERROR_SUCCESS = 0&
Function GetRegValue(lRoot As Long, sKey As String, sEntry As String) As String
   Dim Ret As Long
   Dim hKey As Long
   Dim KeyName As String
   Dim Ret2 As Long
   Dim I As Integer
   Dim sValue As String
   Dim l As Long
   sValue = Space(256)
   Ret = RegOpenKey(lRoot, sKey, hKey)
   If Ret = ERROR_SUCCESS Then
      l = 256
      Ret2 = RegQueryValueExStr(hKey, sEntry, 0&, REG_SZ, sValue, l)
      If Ret2 = ERROR_SUCCESS Then
         If l > 0 Then  ' if it's more than just a null
            GetRegValue = Left(sValue, l - 1)
         End If
      End If
      Ret = RegCloseKey(hKey)
   End If
End Function

To get the registry value, invoke this command

DefProf = GetRegValue(HKEY_CURRENT_USER, "Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles", "DefaultProfile")

This example is for WinNT.  For Win95, just use the line

DefProf = GetRegValue(HKEY_CURRENT_USER, "Software\Microsoft\Windows Messaging Subsystem\Profiles", "DefaultProfile")


Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
kfenskeAuthor Commented:
I think I figured out the problem with licensing.  It seems that I had copied the mapisession and mapimessage objects from my VB app to the Access app.  While this worked fine on my machine it did not work on the client.  When I recreated the objects directly in Access it seems to have fixed the problem.

Thanks for the great answer on the registry!

It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Visual Basic Classic

From novice to tech pro — start learning today.