Click here to Skip to main content
12,691,789 members (27,814 online)
Click here to Skip to main content
Add your own
alternative version

Stats

306K views
1.8K downloads
43 bookmarked
Posted

SendTo mail recipient

, 31 Mar 2003
Rate this:
Please Sign up or sign in to vote.
Programmatically use the SendTo mail recipient shortcut

Introduction

This article provides a code snippet in order to programmatically send one or more files to the mail recipient, mimicking the SendTo mail recipient shell extension. I have heard many people searching for this feature, and actually I thought that, as there doesn't seem to be such source code posted on the net, I could just as well post it.

Introducing the SendTo mail shortcut

You may skip this section if you are not interested in the r.e. technique.

The SendTo mail shortcut is a shell extension. See Mike Dunn's complete idiot guide for further info.

The trick is to find out that the SendTo mail recipient shortcut is actually essentially an empty file with .MAPIMAIL as (hidden) extension name. Then, by looking up file type association in the registry (HKCR\.MAPIMAIL), it's straight forward to figure out that it is targeting a COM object with clsid = {9E56BE60-C50F-11CF-9A2C-00A0C90A90CE}. This object is sendmail.dll, a COM helper which takes advantage of either Outlook Express or Outlook to send e-mail file attachments. Next, looking up this CLSID in OLE View clearly showed that the sendmail COM component also implements the IDropTarget, IShellExtInit and IPersistFile interfaces, just like any drop handler.

Ok, basically I need to prepare a bag with dropped filenames, make sure they can be retrieved by implementing the IDataObject interface, a simple communication interface, and then mimic a standard drag and drop sequence, with two check points : DragEnter(IDataObject*) and Drop(IDataObject*).

One of the interesting points is to start implementing the IDataObject interface starting with contract, i.e. the methods it is supposed to expose. And then cowardly insert a breakpoint into any default method implementation only to get to know whether it's called or not, and in what order.

If you are interested in mimicking other SendTo shortcuts, don't hesitate to check out this registry key:HKLM\Software\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved .

IDataObject implementation

The following code implements the IDataObject interface. In fact, only a few methods are required to be implemented. Those are, in order:

  • EnumFormatEtc(), called by the sendmail helper to know what content formats the IDataObject is holding
  • IEnumFORMATETC::Next(),Reset(), called to list all formats. We are expected to let the sendmail helper know that we do hold the CF_HDROP clipboard format (standard used for file drag-and-drop support), even if in fact we are not using the clipboard at all.
  • GetData(), called to actually get the list of files we are willing to send.

Because on Windows file drag-and-drop operations rely on the CF_HDROP / DROPFILES structure, we simply prepare such a structure to play with. Here is the code :

#include <windows.h>
#include <ole2.h> // IDataObject
#include <shlobj.h> // DROPFILES
#include <tchar.h> // TCHAR

class CDataObject : public IDataObject, IEnumFORMATETC
{
  // Members
protected:
  BOOL m_bReset;
  LPTSTR m_szFiles;
  int m_nLen;

    // Constructor
public:
  CDataObject(LPTSTR szFiles)
  {
    Reset();

    if (!szFiles)
    {
      m_szFiles = NULL;
      return;
    }

    // replace \n chars with \0 chars
    m_nLen = _tcslen(szFiles)+1;
    m_szFiles = new TCHAR[m_nLen];
    memcpy(m_szFiles, szFiles, m_nLen * sizeof(TCHAR));

    LPTSTR szTmp = m_szFiles;
    while ( szTmp=_tcschr(szTmp,'\n') )
      *szTmp++ = '\0';

  }

  virtual ~CDataObject()
  {
    delete [] m_szFiles;
  }

public:
  HRESULT __stdcall QueryInterface(REFIID iid, void** ppvObject)
  {
    *ppvObject = (IDataObject*) this;
    return S_OK;
  }

  ULONG __stdcall AddRef()
  {
    return 1;
  }
  ULONG __stdcall Release()
  {
    return 0;
  }



  // IDataObject implementation
  //
  HRESULT __stdcall GetData(FORMATETC* pFormatetc, STGMEDIUM* pmedium)
  {
    if (pFormatetc->cfFormat != CF_HDROP  || !pmedium)
      return S_FALSE;

    if (!m_szFiles)
      return S_FALSE; // make sure to set the files before

    pmedium->tymed = TYMED_HGLOBAL;

    // set DROPFILES structure
    HGLOBAL hglbCopy = ::GlobalAlloc(GMEM_MOVEABLE, 
                 sizeof(DROPFILES) + (m_nLen + 2) * sizeof(TCHAR)); 
    LPDROPFILES pDropFiles = (LPDROPFILES) ::GlobalLock(hglbCopy);
    pDropFiles->pFiles = sizeof(DROPFILES);
    pDropFiles->pt.x = pDropFiles->pt.y = 0;
    pDropFiles->fNC = TRUE;
    pDropFiles->fWide = FALSE; // ANSI charset
    LPTSTR lptstrCopy = (LPTSTR) pDropFiles;
    lptstrCopy += pDropFiles->pFiles;
    memcpy(lptstrCopy, m_szFiles, m_nLen * sizeof(TCHAR)); 
    lptstrCopy[m_nLen] =  '\0';    // null character 
    lptstrCopy[m_nLen+1] = '\0';    // null character 
    ::GlobalUnlock(hglbCopy); 

    pmedium->hGlobal = hglbCopy;
    pmedium->pUnkForRelease = NULL;

    return S_OK;
  }

  HRESULT __stdcall GetDataHere(FORMATETC* pFormatetc, STGMEDIUM* pmedium)
  {
    return S_OK;
  }

  HRESULT __stdcall QueryGetData(FORMATETC* pFormatetc)
  {
    return S_OK;
  }

  HRESULT __stdcall GetCanonicalFormatEtc(FORMATETC* pFormatetcIn, 
                                          FORMATETC* pFormatetcOut)
  {
    return S_OK;
  }

  HRESULT __stdcall SetData(FORMATETC* pFormatetc, 
                   STGMEDIUM* pmedium, BOOL fRelease)
  {
    return S_OK;
  }

  HRESULT __stdcall EnumFormatEtc(DWORD dwDirection, 
                        IEnumFORMATETC** ppenumFormatetc)
  {
    if (dwDirection==DATADIR_GET)
    {
      *ppenumFormatetc = this;
      return S_OK;
    }
    else
      return S_FALSE;
  }

  HRESULT __stdcall DAdvise(FORMATETC* pFormatetc, 
                            DWORD advf, 
                            IAdviseSink* pAdvSink, 
                            DWORD* pdwConnection)
  {
    return S_OK;
  }

  HRESULT __stdcall DUnadvise(DWORD dwConnection)
  {
    return S_OK;
  }

  HRESULT __stdcall EnumDAdvise(IEnumSTATDATA** ppenumAdvise)
  {
    return S_OK;
  }


  // IEnumFORMATETC implementation
  //
  HRESULT __stdcall Next( 
            /*[in]*/ ULONG celt,
            /*[out]*/ FORMATETC __RPC_FAR* rgelt,
            /*[out]*/ ULONG __RPC_FAR* pceltFetched)
  {
    if (!m_bReset) return S_FALSE;

    m_bReset = FALSE;

    FORMATETC fmt;
    fmt.cfFormat = CF_HDROP;
    fmt.dwAspect = DVASPECT_CONTENT;
    fmt.lindex = -1;
    fmt.ptd = NULL;
    fmt.tymed = TYMED_HGLOBAL;
    *rgelt = fmt; // copy struct
    if (pceltFetched) *pceltFetched = 1;

    return S_OK;
  }
        
  HRESULT __stdcall Skip(/*[in]*/ ULONG celt)
  {
    return S_FALSE;
  }
        
  HRESULT __stdcall Reset()
  {
    m_bReset = TRUE;
    return S_OK;
  }
        
  HRESULT __stdcall Clone( 
            /* [out] */ IEnumFORMATETC** ppenum)
  {
    return S_OK;
  }
};

Using it

And here is how to use it to send c:\346.jpg and c:\tmp\myfile.zip:

::CoInitialize(NULL);

CDataObject cdobj("c:\\346.jpg\nC:\\tmp\\myfile.zip");
IDataObject *pDataObject = &cdobj;


IDropTarget *pDropTarget = NULL;

// create an instance, and mimic drag-and-drop
hr = ::CoCreateInstance( CLSID_SendMail,
                       NULL, CLSCTX_ALL,
                       IID_IDropTarget,
                       (void **)&pDropTarget);
if (SUCCEEDED(hr))
{
  POINTL pt = {0,0};
  DWORD dwEffect = 0;
  pDropTarget->DragEnter(pDataObject, MK_LBUTTON, pt, &dwEffect);
  pDropTarget->Drop(pDataObject, MK_LBUTTON, pt, &dwEffect);

  ::Sleep(6*1000);

  pDropTarget->Release();
}

::CoUninitialize();

To compile this code, you only need WIN32.

Why SendTo is better than the mailto trick

You could tell me that shell-executing a mailto URL is just as fine, and much simpler code in practice. Yes and no. Yes, it does so, and it can't be simpler since that's only one line of code (just remember to escape ASCII chars in the body with hex replacements of the form %0D, %20, ...).

No, it does not provide support for file attachment(s), which is why the SendTo shortcut comes handy. And there is more to it. The truth is that ::ShellExecute() cannot handle parameter strings over 2048 bytes, which means your e-mail body size cannot go beyond 2048 bytes. If you try to send a large e-mail, it will result in a GPF. At this point, you could replace ::ShellExecute with a well thought ::WinExec call, using the actual mailto command line declared in the registry and target the current e-mail client (for instance, "%ProgramFiles%\Outlook Express\msimn.exe" /mailurl:%1). But then the limitation is 32 KB. As a conclusion, there is no way to send e-mails larger than 32KB using the mailto protocol. The SendTo shortcut explained in this article is definitely the way to go !

History

  • First relaese -March 22, 2003.
  • Updated on April 1st, removal of the clipboard use (Chris Guzak).

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

Share

About the Author

Addicted to reverse engineering. At work, I am developing business intelligence software in a team of smart people (independent software vendor).

Need a fast Excel generation component? Try xlsgen.

You may also be interested in...

Comments and Discussions

 
GeneralRe: Anyone got code for .NET Pin
chriskoiak21-Nov-03 6:52
memberchriskoiak21-Nov-03 6:52 
GeneralRe: Anyone got code for .NET Pin
Anonymous24-Nov-03 2:57
sussAnonymous24-Nov-03 2:57 
GeneralAnyone got code that works on XP Pro Pin
Caddy23-Jul-03 12:52
memberCaddy23-Jul-03 12:52 
GeneralRe: Anyone got code that works on XP Pro Pin
johnnycrash24-Jul-03 7:57
memberjohnnycrash24-Jul-03 7:57 
GeneralRe: Anyone got code that works on XP Pro Pin
Caddy24-Jul-03 13:20
memberCaddy24-Jul-03 13:20 
GeneralRe: Anyone got code that works on XP Pro Pin
johnnycrash24-Jul-03 13:48
memberjohnnycrash24-Jul-03 13:48 
GeneralRe: Anyone got code that works on XP Pro Pin
Caddy24-Jul-03 15:34
memberCaddy24-Jul-03 15:34 
GeneralRe: Anyone got code that works on XP Pro Pin
johnnycrash24-Jul-03 21:44
memberjohnnycrash24-Jul-03 21:44 
GeneralRe: Anyone got code that works on XP Pro Pin
Caddy25-Jul-03 10:38
memberCaddy25-Jul-03 10:38 
GeneralRe: Anyone got code that works on XP Pro Pin
johnnycrash25-Jul-03 12:24
memberjohnnycrash25-Jul-03 12:24 
Generalvb6 dll available! Pin
johnnycrash17-Jul-03 14:56
memberjohnnycrash17-Jul-03 14:56 
GeneralRe: vb6 dll available! Pin
johnnycrash17-Jul-03 14:58
memberjohnnycrash17-Jul-03 14:58 
Generalworks for outlook, outlook express, eudora, but not calypso - is there a way to make it work for .lnk files? Pin
johnnycrash18-Jul-03 12:53
memberjohnnycrash18-Jul-03 12:53 
GeneralSend To Anything! Dll that can be called from vb6, and c++ source code Pin
johnnycrash18-Jul-03 17:15
memberjohnnycrash18-Jul-03 17:15 
Ok, this does it all. I am done. You can send to anything that supports IDropTarget. This includes GUID's, .lnk files, .dll files, .exe files, and maybe more, I don't know. I can send files to anything in the send to folder easily. Use this dll (or code) to mimic Send To | Mail Recipient. I still don't have an ftp site to upload the zip file with the compiled dll and source code, so eMail me if you want it.

main code file

// xMain32b.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"

BOOL APIENTRY DllMain(HANDLE hModule, DWORD  fReason, LPVOID lpReserved)
{
   return TRUE;
}
/*----------------------------------------------------------------------------------------------------------*
* SendToDefaultEmail()
*
* Send 1 or more files to the .mapimail drop target.  This does exactly what the context menu "Send To|Mail Recipient" does.
* Essentially this will launch the default email client, if the client is somewhat standard, and create a 
* new email message, with one or more attachment files.  All files must be in same dir.
*
* Parameters:
*  (IO) szFFiles = Files to send
*         - Null term string of one or more files, with files separated with "|", no leading or trailing "|".  
*         - szFFiles will get munged because it is passed to strtok internally.
*  (IO) szPName  = Path of files.
*         - Must have trailing backslash
*         - Can be UNC
* Returns:
*   return code of the internal function that failed.  You are gonna have to look at the code, sorry I'm lazy.
*
*  Example:  
*    1 file --> SendToDefaultEmail ("c:\\", "boot.ini");
*    2 files --> SendToDefaultEmail ("c:\\", "boot.ini|bootlog.txt");
*-----------------------------------------------------------------------------------------------------------*/
DllExport LONG WINAPI SendToDefaultEmail(char *szPName, char *szFFiles) 
{
  return SendToDropTarget("{9E56BE60-C50F-11CF-9A2C-00A0C90A90CE}",szPName,szFFiles);
}
/*----------------------------------------------------------------------------------------------------------*
* SendToDropTarget()
*
* Sends 1 or more files to any "drop target".  This can be any GUID that implements IDropTarget, such as 
* {9E56BE60-C50F-11CF-9A2C-00A0C90A90CE}" which is the GUID for sendmail.dll (i think) which is used by
* any file with the .mapimail extension.  This can also be the filename of a .lnk, .dll, .exe that supports
* IDropTarget.
*
* Parameters:
*  (I)  szFPOrGUIDDropTarget
*         - Null term string that is GUID or path and filename of program that supports IDropTarget.
*         - GUID MUST BE THIS FORM: "{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}"
*  (IO) szFFiles = Files to send
*         - Null term string of one or more files, with files separated with "|", no leading or trailing "|".  
*         - szFFiles will get munged because it is passed to strtok internally.
*  (IO) szPName  = Path of files.
*         - Must have trailing backslash
*         - Can be UNC
* Returns:
*   return code of the internal function that failed.  You are gonna have to look at the code, sorry I'm lazy.
*
*  Example:  
*    GUID --> SendToDropTarget ("{9E56BE60-C50F-11CF-9A2C-00A0C90A90CE}","c:\\", "boot.ini");
*    EXE  --> SendToDropTarget ("C:\\Program Files\\Calypso3\\CSendTo.exe","c:\\","boot.ini");
*    LNK  --> SendToDropTarget ("C:\\Documents and Settings\\jfranco\\SENDTO\\Mail Recipient.mapimail","c:\\","boot.ini");
*-----------------------------------------------------------------------------------------------------------*/
DllExport LONG WINAPI SendToDropTarget(char *szFPOrGUIDDropTarget, char *szPName, char *szFFiles) 
{
  int            iFile,
                 cFiles, 
                 cbFiles,
                 ich;
  DWORD          dwEffect           = DROPEFFECT_COPY | DROPEFFECT_MOVE | DROPEFFECT_LINK;
  POINTL         pt                 = {0,0};
  char          *szFName;
  HRESULT        hr                 = 0;
  wchar_t        wzBuf[MAX_PATH];
  IDataObject   *pDataObject        = NULL;
  IDropTarget   *pDropTarget        = NULL;
  LPSHELLFOLDER  pDeskTopFolder     = NULL,
                 pFolder            = NULL;
  LPITEMIDLIST   pIdlFolder         = NULL,
                 pIdlFile           = NULL;
  LPCITEMIDLIST *apIdlFiles         = NULL;
  LPMALLOC       pMalloc            = NULL;
  GUID           guidDropTarget;

  SHGetMalloc(&pMalloc);
  
  if (!szFPOrGUIDDropTarget || !szFPOrGUIDDropTarget[0] || !szPName || !szPName[0] || 
   !szFFiles || !(cbFiles = strlen(szFFiles))) goto ExitFunc;
  for (cFiles=1,ich=0 ; szFFiles[ich] ; ++ich)
    if (szFFiles[ich] == '|')
      ++cFiles;
  if (!(apIdlFiles = (LPCITEMIDLIST*)calloc(cFiles,sizeof(LPCITEMIDLIST)))) {
    hr = -2;
    goto ExitFunc;
  }
  
  // get any IShellFolder - desktop is convenient
  if ((hr = SHGetDesktopFolder(&pDeskTopFolder)) != 0) goto ExitFunc;  
  
  /**** 
  * GET IDropTarget, the program which is getting files dropped on it.
  ****/
  MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,szFPOrGUIDDropTarget,-1,wzBuf,MAX_PATH);
  if (IIDFromString(wzBuf,&guidDropTarget) == S_OK) {
    // We were passed a GUID string.
    if ((hr = CoCreateInstance(guidDropTarget, NULL, CLSCTX_ALL,IID_IDropTarget, (void **)&pDropTarget)) != 0) goto ExitFunc;
  } else {
    // Must be a filename of a program or link that has an IDropTarget
    char szDDropTarget[MAX_PATH],szPDropTarget[MAX_PATH],szFDropTarget[MAX_PATH],szExtDropTarget[MAX_PATH] ;
    // get path to drop target, and filename of drop target
    _splitpath(szFPOrGUIDDropTarget,szDDropTarget,szPDropTarget,szFDropTarget,szExtDropTarget);
    strcpy(szPDropTarget,strcat(szDDropTarget,szPDropTarget));
    strcat(szFDropTarget,szExtDropTarget);
    // from the path, Get a pidl, pIdlFolder, for szPDropTarget
    MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,szPDropTarget,-1,wzBuf,MAX_PATH);
    if ((hr = pDeskTopFolder->ParseDisplayName(NULL, 0, wzBuf, NULL, &pIdlFolder, NULL)) != 0) goto ExitFunc;
    // from the pidl, pIdlFolder, Get the Shellfolder for szPDropTarget
    if ((hr = pDeskTopFolder->BindToObject(pIdlFolder,NULL,IID_IShellFolder,(void**)&pFolder)) != 0) goto ExitFunc;
    // from the shellfolder and the filename, Get the pidl, pIdlFile, for szFDropTarget
    MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,szFDropTarget,-1,wzBuf,MAX_PATH);
    if ((hr = pFolder->ParseDisplayName(NULL, 0, wzBuf, NULL, &pIdlFile, NULL)) != 0) goto ExitFunc;
    // from the pidl, pIdlFile get the IDropTarget!
    if ((hr = pFolder->GetUIObjectOf(NULL,1,(LPCITEMIDLIST*)&pIdlFile,IID_IDropTarget,NULL,(void**)&pDropTarget)) != 0) goto ExitFunc;
    pMalloc->Free(pIdlFile); 
    pIdlFile = NULL;
    pMalloc->Free(pIdlFolder); 
    pIdlFolder = NULL;
    pFolder->Release();
    pFolder = NULL;
  }

  /****
  * GET one IDataObject for all files being dropped
  ****/
  // from the path, Get a pidl,pIdlFolder, for szPName
  MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,szPName,-1,wzBuf,MAX_PATH);
  if ((hr = pDeskTopFolder->ParseDisplayName(NULL, 0, wzBuf, NULL, &pIdlFolder, NULL)) != 0) goto ExitFunc;
  // from the pidl, pIdlFolder, Get the Shellfolder for szPName
  if ((hr = pDeskTopFolder->BindToObject(pIdlFolder,NULL,IID_IShellFolder,(void**)&pFolder)) != 0) goto ExitFunc;
  // from the shellfolder and the filename, Get the pidl, pIdlFile, for each file in szFFiles, and add to 
  // an array of pidl's, apIdlFiles
  for (cFiles=0,szFName = strtok(szFFiles,"|") ; szFName ; szFName = strtok(NULL,"|")) {
    MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,szFName,-1,wzBuf,MAX_PATH);
    if ((hr = pFolder->ParseDisplayName(NULL, 0, wzBuf, NULL, &pIdlFile, NULL)) != 0) goto ExitFunc;
    apIdlFiles[cFiles++] = pIdlFile;
  }
  // from the pidl array, apIdlFiles get the IDAtaObject for all the files.
  if ((hr = pFolder->GetUIObjectOf(NULL,cFiles,apIdlFiles,IID_IDataObject,NULL,(void**)&pDataObject)) != 0) goto ExitFunc;
  
  /****
  * SERVE UP THE DRAG AND DROP
  ****/
  // our pDataObject onto _pDropTarget, the .mapimail drop target
  if ((hr = pDropTarget->DragEnter(pDataObject, MK_LBUTTON, pt, &dwEffect)) != 0) goto ExitFunc;
  if (!dwEffect) {
    hr = -1;
    goto ExitFunc;
  }
  if ((hr = pDropTarget->Drop(pDataObject, MK_LBUTTON, pt, &dwEffect)) != 0) goto ExitFunc;

  Sleep(100);

ExitFunc:

  if (pDataObject) pDataObject->Release();
  if (apIdlFiles)  {
    for (iFile = 0 ; iFile < cFiles ; ++iFile) 
      if ((void*)apIdlFiles[iFile])
        pMalloc->Free((void*)apIdlFiles[iFile]);
    free(apIdlFiles);
  }
  if (pFolder) pFolder->Release();
  if (pIdlFolder) pMalloc->Free(pIdlFolder);
  if (pDropTarget) pDropTarget->Release();
  if (pMalloc) pMalloc->Release();
  if (pDeskTopFolder) pDeskTopFolder->Release();
 	return hr;
}


header file:

// stdafx.h : include file for standard system include files,
//  or project specific include files that are used frequently, but
//      are changed infrequently
//

#if !defined(AFX_STDAFX_H__F63181D9_FBE8_4BD0_8835_5EEC2FD181BB__INCLUDED_)
#define AFX_STDAFX_H__F63181D9_FBE8_4BD0_8835_5EEC2FD181BB__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000


// Insert your headers here
#define WIN32_LEAN_AND_MEAN		// Exclude rarely-used stuff from Windows headers

#include <windows.h>


// TODO: reference additional headers your program requires here
#include <ole2.h> // IDataObject
#include <shlobj.h> // DROPFILES
#include <tchar.h> // TCHAR

#define DllExport   __declspec( dllexport )
extern "C" {
  DllExport LONG WINAPI SendToDefaultEmail(char *szPFiles, char *szFFiles);
  DllExport LONG WINAPI SendToDropTarget(char *szFPOrGUIDDropTarget, char *szPName, char *szFFiles);
}

#define INLINE_UUID(x) __uuidof(struct __declspec(uuid(x)))

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_STDAFX_H__F63181D9_FBE8_4BD0_8835_5EEC2FD181BB__INCLUDED_)



def file:

LIBRARY OSRegExp01
DESCRIPTION "Implements Drop Target Functions"

EXPORTS

 SendToDefaultEmail	@1
 SendToDropTarget   @2

GeneralRe: Send To Anything! Dll that can be called from vb6, and c++ source code Pin
Larry Hunt18-Jul-03 20:07
sussLarry Hunt18-Jul-03 20:07 
GeneralRe: Send To Anything! Dll that can be called from vb6, and c++ source code Pin
WayneHough12-Jul-06 9:06
memberWayneHough12-Jul-06 9:06 
GeneralRe: vb6 dll available! Pin
Carl03918-Jul-03 13:06
memberCarl03918-Jul-03 13:06 
GeneralRe: vb6 dll available! Pin
Anonymous21-Nov-03 6:20
sussAnonymous21-Nov-03 6:20 
GeneralRe: vb6 dll available! Pin
Dasith24-Nov-03 21:53
sussDasith24-Nov-03 21:53 
GeneralRe: vb6 dll available! Pin
Dasith24-Nov-03 21:53
sussDasith24-Nov-03 21:53 
GeneralRe: vb6 dll available! Pin
amanda_hua@hotmail.com3-Dec-03 14:00
memberamanda_hua@hotmail.com3-Dec-03 14:00 
GeneralThank you Pin
Larry Hunt25-Jun-03 9:22
sussLarry Hunt25-Jun-03 9:22 
GeneralRe: Thank you Pin
Martin Fuchs28-Jun-03 11:00
memberMartin Fuchs28-Jun-03 11:00 
GeneralRe: Thank you Pin
Martin Fuchs14-Jul-03 12:57
memberMartin Fuchs14-Jul-03 12:57 
GeneralRe: Thank you Pin
johnnycrash17-Jul-03 5:47
memberjohnnycrash17-Jul-03 5:47 
GeneralWindows XP Pin
Martin Fuchs17-Jul-03 22:54
memberMartin Fuchs17-Jul-03 22:54 
GeneralRe: Windows XP Pin
johnnycrash18-Jul-03 6:50
memberjohnnycrash18-Jul-03 6:50 
Generaldefault email address Pin
agd01119-Jun-03 10:55
memberagd01119-Jun-03 10:55 
GeneralRe: default email address Pin
Stephane Rodriguez.19-Jun-03 20:07
memberStephane Rodriguez.19-Jun-03 20:07 
GeneralRe: default email address Pin
agd01123-Jun-03 8:25
memberagd01123-Jun-03 8:25 
Questionenter a &quot;to:&quot; email address?? Pin
Anonymous19-Jun-03 10:51
sussAnonymous19-Jun-03 10:51 
GeneralWinXP Pin
GregSmithAuto12-Jun-03 18:50
memberGregSmithAuto12-Jun-03 18:50 
GeneralI can't use this code. Plz help. Pin
-=JoKeR=-22-May-03 11:00
member-=JoKeR=-22-May-03 11:00 
Questionsend to email. How to set it for Outlook? Pin
gok16-May-03 14:27
membergok16-May-03 14:27 
AnswerRe: send to email. How to set it for Outlook? Pin
Stephane Rodriguez.16-May-03 18:57
memberStephane Rodriguez.16-May-03 18:57 
QuestionVB6 DLL ? Pin
Carl03912-May-03 10:14
memberCarl03912-May-03 10:14 
AnswerRe: VB6 DLL ? Pin
johnnycrash17-Jul-03 14:24
memberjohnnycrash17-Jul-03 14:24 
Generalmailto: and attachments Pin
DavidCrow8-Apr-03 6:30
memberDavidCrow8-Apr-03 6:30 
GeneralRe: mailto: and attachments Pin
.S.Rod.8-Apr-03 7:05
member.S.Rod.8-Apr-03 7:05 
GeneralRe: mailto: and attachments Pin
DavidCrow8-Apr-03 8:35
memberDavidCrow8-Apr-03 8:35 
GeneralRe: mailto: and attachments Pin
.S.Rod.8-Apr-03 10:00
member.S.Rod.8-Apr-03 10:00 
GeneralRe: mailto: and attachments Pin
DavidCrow8-Apr-03 10:04
memberDavidCrow8-Apr-03 10:04 
GeneralRe: mailto: and attachments Pin
john_bechel11-Apr-03 8:26
memberjohn_bechel11-Apr-03 8:26 
GeneralRe: mailto: and attachments Pin
DavidCrow11-Apr-03 8:35
memberDavidCrow11-Apr-03 8:35 
GeneralMFC implementation Pin
Bart D2-Apr-03 2:46
memberBart D2-Apr-03 2:46 
GeneralMFC implementation Pin
Bart D2-Apr-03 2:56
memberBart D2-Apr-03 2:56 
GeneralRe: MFC implementation Pin
Aisha Ikram2-Apr-03 3:00
memberAisha Ikram2-Apr-03 3:00 
GeneralRe: MFC implementation Pin
.S.Rod.2-Apr-03 3:43
member.S.Rod.2-Apr-03 3:43 
GeneralMAPI Pin
RichardGrimmer2-Apr-03 0:19
memberRichardGrimmer2-Apr-03 0:19 
GeneralRe: MAPI Pin
.S.Rod.2-Apr-03 1:24
member.S.Rod.2-Apr-03 1:24 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web02 | 2.8.170117.1 | Last Updated 1 Apr 2003
Article Copyright 2003 by Stephane Rodriguez.
Everything else Copyright © CodeProject, 1999-2017
Layout: fixed | fluid