Maybe this will be useful. I certainly have a hard time spelling
some words. All comments welcome. I have a nice ABC block icon
PBR if anyone wants it.

Code:
#PBFORMS Created
'--------------------------------------------------------------------------------
' The first line in this file is a PBForms metastatement.
' It should ALWAYS be the first line of the file. Other
' PBForms metastatements are placed at the beginning and
' ending of blocks of code that should be edited using
' PBForms only. Do not edit or delete these
' metastatements or PBForms will not be able to reread
' the file correctly. See the PBForms documentation for
' more information.
' Beginning blocks begin like this: #PBForms Begin ...
' Ending blocks begin like this:    #PBForms End ...
' Other PBForms metastatements such as:
'     #PBForms Declarations
' are used to tell PBForms where to insert additional
' code. Feel free to make changes anywhere else in the file.
'--------------------------------------------------------------------------------
'
'***************************Word dependent spell check***************************
'This will work with at least Word 97 & 2000.
'oword9.inc if you haven't done it yet is created by Com browser.
'Easy to select all interfaces and save to file.
'My Word.Application.9 will not work with .8. I have 97 and 2000.
'You should probably make *.inc for your version.
'App works with 3 PC's all running Win98SE. For some reason I have not discovered
'there is a bug that shows up in my fourth, wife's machine. Word does not always
'open first time for her. It does always open second try. No idea...tried every
'PB trick I could find. That includes everything you can see in OBJACTIVE Function
'Help plus links. If anyone has ideas I should like to hear from you.
#COMPILE EXE
#DIM ALL
#INCLUDE "oword9.inc"

'--------------------------------------------------------------------------------
'   ** Includes **
'--------------------------------------------------------------------------------
#PBFORMS Begin Includes
#RESOURCE "SpellCheck.pbr"
#IF NOT %DEF(%WINAPI)
    #INCLUDE "WIN32API.INC"
#ENDIF
#PBFORMS End Includes
'--------------------------------------------------------------------------------

'--------------------------------------------------------------------------------
'   ** Constants **
'--------------------------------------------------------------------------------
#PBFORMS Begin Constants
%IDD_SPELLCHECK     = 101
%IDR_IMGFILE1       = 102
%IDC_CHECKSPELLING  = 1001
%IDC_QUIT           = 1002
%IDC_LABEL1         = 1003
%IDC_SPELLCHECKBOX  = 1004
#PBFORMS End Constants
$AppTitle = "Spell Check"

GLOBAL DialogWindow AS DWORD 'If you use PBForms this is an easy way to use handle.
'--------------------------------------------------------------------------------

'--------------------------------------------------------------------------------
'   ** Declarations **
'--------------------------------------------------------------------------------
DECLARE CALLBACK FUNCTION ShowSPELLCHECKProc()
DECLARE FUNCTION SampleListBox(BYVAL hDlg AS DWORD, BYVAL lID AS LONG, BYVAL _
    lCount AS LONG) AS LONG
DECLARE FUNCTION ShowSPELLCHECK(BYVAL hParent AS DWORD) AS LONG
DECLARE SUB DisplayResult(msg AS STRING)
#PBFORMS Declarations
'--------------------------------------------------------------------------------
'Function provided by Lance. This function is more helpful than a bunch of numbers.
'***Highly recommended***
FUNCTION ObjErr(BYVAL pbError AS LONG, BYVAL dError AS DWORD) AS STRING
    LOCAL pBuffer   AS ASCIIZ PTR
    LOCAL ncbBuffer AS DWORD
    LOCAL a$

    ncbBuffer = FormatMessage(%FORMAT_MESSAGE_ALLOCATE_BUFFER OR _
        %FORMAT_MESSAGE_FROM_SYSTEM OR %FORMAT_MESSAGE_IGNORE_INSERTS, _
        BYVAL %NULL, dError, BYVAL MAKELANGID(%LANG_NEUTRAL, %SUBLANG_DEFAULT), _
        BYVAL VARPTR(pBuffer), 0, BYVAL %NULL)

    IF pbError THEN a$ = "(PB Error =" & STR$(pbError) & ")"

    IF ncbBuffer THEN
        a$ = " " & @pBuffer & " (&H" & HEX$(dError, 8) & ") " + a$
        REPLACE $CRLF WITH "" IN a$
        FUNCTION = a$
        LocalFree pBuffer
    ELSE
        FUNCTION = " Unknown error (&H" & HEX$(dError, 8) & ") " + a$
    END IF
END FUNCTION

FUNCTION CheckSpelling(BYVAL hDlg AS DWORD) AS LONG
    DIM oWordApp AS WordApplication 'Object or Dispatch variables
    DIM oWordDocs AS WordDocuments
    DIM oWordSel AS WordSelection
    DIM oWordDiag AS WordDialog

    DIM vVnt AS VARIANT      'Everything coming or going has to be Variant.
    DIM vText AS VARIANT
    DIM vBool AS VARIANT
    DIM vDiag AS VARIANT
    DIM vCorrect AS VARIANT
    DIM lOrigTop AS VARIANT

    LOCAL SpellWord AS STRING
    LOCAL SpaceFind AS LONG


    CONTROL GET TEXT DialogWindow, %IDC_SPELLCHECKBOX TO SpellWord
    IF SpellWord = "" THEN EXIT FUNCTION
    SpaceFind = INSTR(SpellWord, " ")
    'Should check for all manner of illegal charactors here but I havn't yet
    IF SpaceFind > 0 THEN
        MSGBOX "Please enter only one word without spaces.", %MB_ICONINFORMATION, $AppTitle
        EXIT FUNCTION
    END IF

    ' Open an instance of MSWORD *Copy and paste from OWord.bas Lots of that here.
    SET oWordApp = WordApplication IN "Word.Application"
    IF ISFALSE ISOBJECT(oWordApp) THEN _
        SET oWordApp = NEW WordApplication IN "Word.Application"

    'Could MSWORD be opened? If not, terminate this app
    IF ISFALSE ISOBJECT(oWordApp) THEN
        MSGBOX "Unable to open Word."  '***This is where my wifes machine ends up.***
        EXIT FUNCTION
    END IF

    LET vVnt = 0
    OBJECT CALL oWordApp.Documents.Add TO vVnt
    IF OBJRESULT OR ERR THEN
        MSGBOX "oWordApp.Documents.Add:  " & ObjErr(ERRCLEAR, OBJRESULT) & STR$(VARIANT#(vVnt)), %MB_ICONEXCLAMATION
        EXIT FUNCTION
    END IF
    SET oWordDocs = vVnt

    OBJECT GET oWordApp.Selection TO vVnt
    IF OBJRESULT OR ERR THEN
        MSGBOX "oWordApp.Selection:  " & ObjErr(ERRCLEAR, OBJRESULT) & STR$(VARIANT#(vVnt)), %MB_ICONEXCLAMATION
        EXIT FUNCTION
    END IF
    SET oWordSel = vVnt

    LET vText = SpellWord
    OBJECT LET oWordSel.Text = vText 'Puts in and selects word to spell

    LET vDiag = %wdDialogToolsSpellingAndGrammar   'Got this from Microsoft.
    OBJECT CALL oWordApp.Dialogs.Item(vDiag) TO vVnt  'Gets interface to spell check dialog
    IF OBJRESULT OR ERR THEN
        MSGBOX "oWordDiag.Dialogs.Item(vDiag):  " & ObjErr(ERRCLEAR, OBJRESULT) & STR$(VARIANT#(vVnt)), %MB_ICONEXCLAMATION
        EXIT FUNCTION
    END IF
    SET oWordDiag = vVnt

    ' Make MSWORD visible
    LET vBool = 1
    OBJECT LET oWordApp.Visible = vBool  'Make word visible so you can hide it.
    IF OBJRESULT OR ERR THEN
        MSGBOX "oWordApp.Visible = vBool:  " & ObjErr(ERRCLEAR, OBJRESULT) & STR$(VARIANT#(vVnt)), %MB_ICONEXCLAMATION
        EXIT FUNCTION
    END IF

    OBJECT GET oWordApp.Top TO lOrigTop  'This from Microsoft also
    IF OBJRESULT OR ERR THEN
        MSGBOX "oWordApp.Top TO lOrigTop:  " & ObjErr(ERRCLEAR, OBJRESULT) & STR$(VARIANT#(vVnt)), %MB_ICONEXCLAMATION
        EXIT FUNCTION
    END IF

    LET vVnt = 0
    OBJECT LET oWordApp.WindowState = vVnt 'Ditto
    IF OBJRESULT OR ERR THEN
        MSGBOX "oWordApp.WindowState = vVnt:  " & ObjErr(ERRCLEAR, OBJRESULT) & STR$(VARIANT#(vVnt)), %MB_ICONEXCLAMATION
        EXIT FUNCTION
    END IF

    LET vVnt= -3000                  'And more from Bill
    OBJECT LET oWordApp.Top = vVnt
    IF OBJRESULT OR ERR THEN
        MSGBOX "oWordApp.Top = vVnt:  " & ObjErr(ERRCLEAR, OBJRESULT) & STR$(VARIANT#(vVnt)), %MB_ICONEXCLAMATION
        EXIT FUNCTION
    END IF

    OBJECT CALL oWordDiag.Show TO vBool 'Makes visible %wdDialogToolsSpellingAndGrammar
    IF OBJRESULT OR ERR THEN
        MSGBOX "oWordDiag.Show:  " & ObjErr(ERRCLEAR, OBJRESULT) & STR$(VARIANT#(vVnt)), %MB_ICONEXCLAMATION
        EXIT FUNCTION
    END IF

    LET vVnt = 0
    OBJECT LET oWordApp.Selection.Start = vVnt 'Puts at start and selects correctly spelled word
    IF OBJRESULT OR ERR THEN
        MSGBOX "oWordApp.Selection.Start:  " & ObjErr(ERRCLEAR, OBJRESULT) & STR$(VARIANT#(vVnt)), %MB_ICONEXCLAMATION
        EXIT FUNCTION
    END IF

    OBJECT GET oWordApp.Selection.Text TO vCorrect 'Get selected correctly spelled word
    IF OBJRESULT OR ERR THEN
        MSGBOX "oWordApp.Selection.Copy:  " & ObjErr(ERRCLEAR, OBJRESULT) & STR$(VARIANT#(vVnt)), %MB_ICONEXCLAMATION
        EXIT FUNCTION
    END IF

    'Dialog returns true if word is changed, false if no change.
    IF ISTRUE VARIANT#(vBool) = -1 THEN CONTROL SET TEXT DialogWindow, %IDC_SPELLCHECKBOX, VARIANT$(vCorrect)

    '
    IF SpellWord = VARIANT$(vCorrect) AND ISTRUE VARIANT#(vBool) = -1 THEN _
        CONTROL SET TEXT DialogWindow, %IDC_SPELLCHECKBOX, SpellWord + " ...is spelled correctly."


    Terminate:
        LET vVnt = %wdDoNotSaveChanges  'Another tidbit from Microsoft
        OBJECT CALL oWordApp.Documents.Close(vVnt) 'Close without saving changes
        IF OBJRESULT OR ERR THEN
            MSGBOX "oWordApp.Documents.Close(vVnt):  " & ObjErr(ERRCLEAR, OBJRESULT) & STR$(VARIANT#(vVnt)), %MB_ICONEXCLAMATION
            EXIT FUNCTION
        END IF

        LET vVnt= 0
        OBJECT LET oWordApp.Top = vVnt 'My machine with Word 97 developed a profound desire to stay minimized without this.
        IF OBJRESULT OR ERR THEN
            MSGBOX "oWordApp.Top = vVnt:  " & ObjErr(ERRCLEAR, OBJRESULT) & STR$(VARIANT#(vVnt)), %MB_ICONEXCLAMATION
            EXIT FUNCTION
        END IF

        OBJECT CALL oWordApp.Quit 'Close Word.
        ' Close all of the Interfaces
        SET oWordSel  = NOTHING
        SET oWordDocs  = NOTHING
        SET oWordApp  = NOTHING
        SET oWordDiag = NOTHING

    FUNCTION = %TRUE
END FUNCTION


FUNCTION PBMAIN()

    ShowSPELLCHECK %HWND_DESKTOP

    FUNCTION = %TRUE
END FUNCTION
'--------------------------------------------------------------------------------

'--------------------------------------------------------------------------------
'   ** CallBacks **
'--------------------------------------------------------------------------------
CALLBACK FUNCTION ShowSPELLCHECKProc()
    LOCAL SetSelection AS LONG
    LOCAL SpellCheck AS STRING
    SELECT CASE CBMSG
        CASE %WM_INITDIALOG  'Select opening string so you will not have to.
            CONTROL SEND CBHNDL, %IDC_SPELLCHECKBOX, %EM_SETSEL, 0, 71
            CONTROL SET FOCUS CBHNDL, %IDC_SPELLCHECKBOX
        CASE %WM_COMMAND
            SELECT CASE CBCTL
                CASE %IDC_CHECKSPELLING
                    IF CBCTLMSG = %BN_CLICKED OR CBCTLMSG = 1 THEN
                        CALL CheckSpelling(CBHNDL)
                    END IF
                CASE %IDC_QUIT
                    IF CBCTLMSG = %BN_CLICKED OR CBCTLMSG = 1 THEN
                        DIALOG END CBHNDL, 0
                    END IF
                CASE %IDC_LABEL1
                CASE %IDC_SPELLCHECKBOX

            END SELECT
    END SELECT

END FUNCTION

'--------------------------------------------------------------------------------
'   ** Dialogs **
'--------------------------------------------------------------------------------
FUNCTION ShowSPELLCHECK(BYVAL hParent AS DWORD) AS LONG
    LOCAL lRslt AS LONG
#PBFORMS Begin Dialog %IDD_SPELLCHECK->->
    LOCAL hDlg AS DWORD

    DIALOG NEW hParent, "Spell Check", 206, 127, 302, 59, %WS_POPUP OR _
        %WS_BORDER OR %WS_DLGFRAME OR %WS_CAPTION OR %WS_SYSMENU OR _
        %WS_CLIPSIBLINGS OR %WS_VISIBLE OR %DS_MODALFRAME OR %DS_3DLOOK OR _
        %DS_NOFAILCREATE OR %DS_SETFONT, %WS_EX_WINDOWEDGE OR _
        %WS_EX_CONTROLPARENT OR %WS_EX_LEFT OR %WS_EX_LTRREADING OR _
        %WS_EX_RIGHTSCROLLBAR, TO hDlg
    DIALOG SET ICON hDlg, "#" + FORMAT$(%IDR_IMGFILE1)
    CONTROL ADD BUTTON, hDlg, %IDC_CHECKSPELLING, "Check Spelling", 5, 40, 55, _
        15, %WS_CHILD OR %WS_VISIBLE OR %WS_TABSTOP OR %BS_TEXT OR _
        %BS_PUSHBUTTON OR %BS_DEFPUSHBUTTON OR %BS_CENTER OR %BS_VCENTER, _
        %WS_EX_LEFT OR %WS_EX_LTRREADING
    CONTROL ADD BUTTON, hDlg, %IDC_QUIT, "Quit", 245, 40, 50, 15
    CONTROL ADD LABEL, hDlg, %IDC_LABEL1, "Spelling Checked by Microsoft Word", _
        90, 5, 120, 10
    CONTROL ADD TEXTBOX, hDlg, %IDC_SPELLCHECKBOX, "Type word to check here...", _
        5, 15, 290, 13, %WS_CHILD OR %WS_VISIBLE OR %WS_TABSTOP OR %ES_LEFT OR _
        %ES_AUTOVSCROLL, %WS_EX_CLIENTEDGE OR %WS_EX_LEFT OR %WS_EX_LTRREADING _
        OR %WS_EX_RIGHTSCROLLBAR

#PBFORMS End Dialog

    DialogWindow = hDlg

    DIALOG SHOW MODAL hDlg, CALL ShowSPELLCHECKProc TO lRslt

    FUNCTION = lRslt
END FUNCTION
Thanks to Tom for telling me about that UBB [ Code] thing.

------------------