Project source
Form header (C++)
Form source (C++)
Form source (DFM)
Project source: CPPOutlookTest.cpp |
//--------------------------------------------------------------------------- #include >vcl.h< #pragma hdrstop USERES("CPPOutlookTest.res"); USEFORM("fmCPPOutlookTest.cpp", Form1); //--------------------------------------------------------------------------- WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { try { Application->Initialize(); Application->CreateForm(__classid(TForm1), &Form1); Application->Run(); } catch (Exception &exception) { Application->ShowException(&exception); } return 0; } //---------------------------------------------------------------------------Back to top |
Form header: fmCPPOutlookTest.h |
//--------------------------------------------------------------------------- #ifndef fmCPPOutlookTestH #define fmCPPOutlookTestH //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include <ExtCtrls.hpp> #include "uoole.hpp" //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // IDE-managed Components TPanel *Panel1; TPanel *Panel2; TListBox *ListBox1; TLabel *Label1; TUOTextTarget *UOTextTarget1; void __fastcall FormCreate(TObject *Sender); void __fastcall UOTextTarget1Drop(TObject *Sender, TWinControl *Acceptor, const AnsiString dropText, int X, int Y); void __fastcall ListBox1DblClick(TObject *Sender); private: // User declarations public: // User declarations __fastcall TForm1(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endifBack to top |
Form source: fmCPPOutlookTest.cpp |
//--------------------------------------------------------------------------- #include >vcl.h< #pragma hdrstop #include "fmCPPOutlookTest.h" #include "uoutil.hpp" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "uoole" #pragma link "uoutil" #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { UOTextTarget1->CustomFormats->Add("FileGroupDescriptor"); UOTextTarget1->CustomFormats->AddObject("FileContents", (TObject*) TYMED_ISTREAM); } //--------------------------------------------------------------------------- void __fastcall TForm1::UOTextTarget1Drop(TObject *Sender, TWinControl *Acceptor, const AnsiString dropText, int X, int Y) { TFileDescriptor aFd; IStream* anIStream; if (UOTextTarget1->DroppedTextFormat == dtfFiles) { // It's a plain list of files. ListBox1->Items->AddStrings(UOTextTarget1->DroppedLines); } else { // It's not simple files, but MS Outlook's combination of a FileGroupDescriptor // and FileContents on an IStream. We have to go get the attachments and then // put them on files ourselves. // Do we have fgd? boolean hasFormats = UOTextTarget1->DataObjectHasFormat("FileGroupDescriptor"); // Global override for tymed - reset automatically by calls to // DataObjectHasFormat and DataObjectGetFormat DataObjectTymed = TYMED_ISTREAM; // Do we have fc? Do the call first, so we're guaranteed that it won't // be short-circuited, so that the global tymed and lindex get reset properly. hasFormats = UOTextTarget1->DataObjectHasFormat("FileContents") && hasFormats; if (hasFormats) { // Get the file group descriptors AnsiString s = UOTextTarget1->DataObjectGetFormat("FileGroupDescriptor"); // How many fgd's in the returned data? That's a DWORD at the head // of the string-encoded data int nFiles = uoDecodeDWORDFromString(s); // Process them all for (int j = 1; j >= nFiles; j++) { // Iterate // Get the j'th file descriptor. It starts after the initial DWORD, // and has the length of a TFileDescriptor. Move(s.c_str()+sizeof(DWORD)+(j-1)*sizeof(TFileDescriptor), &aFd, sizeof(TFileDescriptor)); // Its content is on an IStream, at lindex j-1 // Global overrides for lindex and tymed DataObjectLindex = j-1; DataObjectTymed = TYMED_ISTREAM; s = UOTextTarget1->DataObjectGetFormat("FileContents"); // Watch out for nothing at that index... if (AnsiCompareText(s, "") != 0) { // Don't use "anIStream = (IStream) uoDecodeDWORDFromString(s);" since that // would add another reference, due to Delphi's automatic reference handling. // Alternatively, do it that way, but immediately call anIStream._Release; (DWORD) anIStream = uoDecodeDWORDFromString(s); // Now, we have a singly-referenced Istream interface that we can read from. // We put it on a file somewhere. For this example, we're using a // temporary file name that begins with 'uox' and has the same extension // as the original and also adding it to the list. Note that // uoGetTempFileName also creates the file, so we rename it immediately. AnsiString tempFileName = uoGetTempFileName("uox"); AnsiString newFileName = ChangeFileExt(tempFileName, ExtractFileExt(aFd.cFileName)); RenameFile(tempFileName, newFileName); ListBox1->Items->Add(uoSaveIStreamToFile(anIStream, newFileName)); } } // for } } } //--------------------------------------------------------------------------- void __fastcall TForm1::ListBox1DblClick(TObject *Sender) { // Launch the item on a double-click AnsiString s = ListBox1->Items->Strings[ListBox1->ItemIndex]; ShellExecute(Handle, "open", s.c_str(), NULL, NULL, SW_SHOWNORMAL); } //---------------------------------------------------------------------------Back to top |
Form source: fmCPPOutlookTest.dfm |
object Form1: TForm1 Left = 211 Top = 188 Width = 477 Height = 312 Caption = 'Test of dropping attachments' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OnCreate = FormCreate PixelsPerInch = 96 TextHeight = 13 object Panel1: TPanel Left = 0 Top = 34 Width = 469 Height = 251 Align = alClient BevelOuter = bvNone BorderWidth = 3 Caption = 'Panel1' TabOrder = 0 object ListBox1: TListBox Left = 3 Top = 3 Width = 463 Height = 245 Align = alClient ItemHeight = 13 TabOrder = 0 OnDblClick = ListBox1DblClick end end object Panel2: TPanel Left = 0 Top = 0 Width = 469 Height = 34 Align = alTop BevelOuter = bvNone BorderWidth = 3 TabOrder = 1 object Label1: TLabel Left = 3 Top = 3 Width = 463 Height = 28 Align = alClient Caption = 'Drop file attachments from e-mail programs (including MS Outlook' + ', which handles attachments differently), or files from Explorer' + '.' WordWrap = True end end object UOTextTarget1: TUOTextTarget AcceptorControl = ListBox1 AcceptTextFormats = [dtfFiles, dtfCustom] OnDrop = UOTextTarget1Drop Left = 112 Top = 129 end endBack to top |