It looks like you're invoking the PrintDlg function, which takes a pointer to a PRINTDLG structure as its one parameter, not a window handle. That may explain the crash. The PRINTDLG structure looks like this:
typedef struct tagPD { DWORD lStructSize; HWND hwndOwner; HGLOBAL hDevMode; HGLOBAL hDevNames; HDC hDC; DWORD Flags; WORD nFromPage; WORD nToPage; WORD nMinPage; WORD nMaxPage; WORD nCopies; HINSTANCE hInstance; LPARAM lCustData; LPPRINTHOOKPROC lpfnPrintHook; LPSETUPHOOKPROC lpfnSetupHook; LPCTSTR lpPrintTemplateName; LPCTSTR lpSetupTemplateName; HGLOBAL hPrintTemplate; HGLOBAL hSetupTemplate; } PRINTDLG, *LPPRINTDLG;
How one would go about representing this in Squeak is beyond me. A few of the members of this structure are handles to other Win32 structures (e.g. hDevMode is a handle to a DEVMODE structure, hDevNames is a handle to a DEVNAMES structure, etc), which doubtless will increase the joy and fun of trying to get your print dialog up on the screen.
As to "...how do I get a document to print..." - well, that's up to your application. PrintDlg just puts up the dialog, initialized and customized as per the structure above (and its substructures, such as DEVMODE and DEVNAMES), captures the user's input, and modifies the data in these structures appropriately. Printing is usually done by obtaining a DC (device context) on the appropriate printer and drawing away to your heart's content. An easy way to do this is to specify PD_RETURNDC in the Flags element of your PRINTDLG structure, which causes PrintDlg to fill in the hDC element of the PRINTDLG structure with a handle to an appropriate DC.
Personally, I think printing is one of the most God-awful things an application ever has to do. It's messy, error-prone, varies from device to device and driver version to driver version, and is ecologically unsound to boot! <grumble> Let 'em read it on the screen if they want to know what's going on, that's what I say... :-)
Bob Jarvis Compuware @ Timken
-----Original Message----- From: Norton, Chris [mailto:chrisn@Kronos.com] Sent: Thursday, June 29, 2000 10:26 PM To: Squeak (E-mail) Subject: [Q] Using FFI to call standard Windows dialogs
Hi Folks.
I was experimenting with FFI on my Windows NT box and I kept crashing my image (virtual memory dumps). Can anybody help me with this call?
Win32Shell>> shellPrintDialog: aHWND "Win32Shell new shellPrintDialog: Win32Window getFocus" <apicall: bool 'PrintDlgA' (Win32Window) module: 'comdlg32.dll'> ^self externalCallFailed
I'm trying to launch the print dialog.
Thanks for your thoughts!
---==> Chris
PS> And my next question is, of course, how do I get a document to print once I've got the dialog launching from Squeak (e.g. how do I provide the dialog with a document to print?)...
squeak-dev@lists.squeakfoundation.org