Skip to main content
Email Password   helpLost your password?

Introduction

Searching around in MSDN trying to find how to use the MS Office spell checker, I found a "fantastic" OLE solution:

  1. Run Word
  2. Push the word to be checked into Word
  3. Get the result.

Thanks very much :(

Then I found this. Through them, I got the Microsoft Common Spell API (CSAPI).

CSAPI

To ensure I respect copyright, I cut the smallest possible example using the default dictionary only, and ignored possible error states or exceptions. You will probably need to modify it for your language and paths (I'm not reading paths from registry).

Below is some sample code that illustrates how to use the SDK.

#include "windows.h"

#include "csapi.h" //with typedef unsigned char CHAR; removed


typedef WORD (*SpellInit_fn) (SPLID FAR *lpSid,
                              WSC FAR  *lpWsc);

typedef WORD (*SpellOpenMdr_fn)(SPLID    splid,
                                LPSPATH  lpspathMain,
                                LPSPATH  lpspathExc,
                                BOOL     fCreateUdrExc,
                                BOOL     fCache,
                                LID      lidExpected,
                                LPMDRS   lpMdrs);

typedef WORD (*SpellCheck_fn)(SPLID    splid,
                              SCCC     iScc,
                              LPSIB    lpSib,
                              LPSRB    lpSrb);

typedef WORD (*SpellCloseMdr_fn)(SPLID    splid,
                                 LPMDRS   lpMdrs);

typedef WORD (*SpellTerminate_fn)(SPLID    splid,
                                  BOOL     fForce);

void main(void)
{
    int Language = 1051; //slovak


    //to be more general search thru registry:

    //Dll functional interface:

    //  HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Shared Tools\

    //           Proofing Tools\Spelling\1051\Normal\Engine

    //Mdr main directory:

    //  HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Shared Tools\

    //           Proofing Tools\Spelling\1051\Normal\Dictionary

    //Under any user directory:

    //  HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Shared Tools\

    //           Proofing Tools\Custom Dictionaries\1


    char DllName[] = 
     "C:\\Program Files\\Common Files\\Microsoft Shared\\Proof\\MSPSK32.DLL";
    char MdrName[] = 
     "C:\\Program Files\\Common Files\\Microsoft Shared\\Proof\\MSSP_SK.LEX";

    HMODULE SpellInstance = LoadLibrary(DllName);

    SpellInit_fn SpellInit = 
      (SpellInit_fn)GetProcAddress(SpellInstance, 
      "SpellInit");
    SpellOpenMdr_fn SpellOpenMdr = 
      (SpellOpenMdr_fn)GetProcAddress(SpellInstance, 
      "SpellOpenMdr");
    SpellCheck_fn SpellCheck = 
      (SpellCheck_fn)GetProcAddress(SpellInstance, 
      "SpellCheck");
    SpellCloseMdr_fn SpellCloseMdr = 
      (SpellCloseMdr_fn)GetProcAddress(SpellInstance, 
      "SpellCloseMdr");
    SpellTerminate_fn SpellTerminate = 
      (SpellTerminate_fn)GetProcAddress(SpellInstance, 
      "SpellTerminate");

    SPLID Handle;
    WSC SpecChars;
    SpecChars.bIgnore = 0;
    SpecChars.bHyphenHard = 45;
    SpecChars.bHyphenSoft = 31;
    SpecChars.bHyphenNonBreaking = 30;
    SpecChars.bEmDash = 151;
    SpecChars.bEnDash = 150;
    SpecChars.bEllipsis = 133;
    SpecChars.rgLineBreak[0] = 11;
    SpecChars.rgLineBreak[1] = 10;
    SpecChars.rgParaBreak[0] = 13;
    SpecChars.rgParaBreak[1] = 10;

    SpellInit(&Handle, &SpecChars);

    MDRS Mdrs;
    SpellOpenMdr(Handle, MdrName, NULL, FALSE, TRUE, Language, &Mdrs);

    SIB InputBuffer;
    InputBuffer.cMdr = 1;
    InputBuffer.lrgMdr = &Mdrs.mdr;
    InputBuffer.cUdr = 0;
    InputBuffer.lrgUdr = NULL;

    SRB ResultBuffer;
    ResultBuffer.cch = 1024;
    ResultBuffer.lrgsz = (char*)malloc(ResultBuffer.cch);
    ResultBuffer.cbRate = 255;
    ResultBuffer.lrgbRating = (unsigned char*)malloc(ResultBuffer.cbRate);

    InputBuffer.lrgch = "slovo"; //tested word

    InputBuffer.cch = strlen(InputBuffer.lrgch);
    InputBuffer.wSpellState = fssStartsSentence;
    SpellCheck(Handle, sccVerifyWord, &InputBuffer, &ResultBuffer);

    int Result = ResultBuffer.scrs; //scrsNoErrors


    free(ResultBuffer.lrgsz);
    free(ResultBuffer.lrgbRating);
    SpellCloseMdr(Handle, &Mdrs);
    SpellTerminate(Handle, TRUE);
    FreeLibrary(SpellInstance);
}

I have tried the above code with Office 95 and Office 97. Installing Office 2000 with English, Slovak and German languages creates a registry Spelling\1051 (slovak) and Grammar\1031 (german) entries.

BTW: My search for a similar WIN API for string comparison failed. It seems Windows knows how to use the actual language only (resp. see .NET Framework Reference, String.Compare Method (String, String, Boolean, CultureInfo)), and there is no way to hook between your application and the system to correct the MS bugs for "small markets" like my country (where exceptional vocabulary or similar solution are necessary for proper string evaluation). If you know more about this, do not hesitate to publish it.

You must Sign In to use this message board.
 
 
Per page   
 FirstPrevNext
GeneralCSAPI3 Pin
leebauer
1:55 2 Nov '09  
Generalhow to complile Pin
leebauer
7:21 21 Oct '09  
GeneralRe: how to complile Pin
Tibor Blazko
1:04 25 Oct '09  
Generalcreating local language spell cheking Pin
tedkidane
8:39 1 Oct '09  
GeneralRe: creating local language spell cheking Pin
Tibor Blazko
10:21 1 Oct '09  
GeneralUsing unicode chars Pin
mita55555
2:34 26 Aug '09  
GeneralRe: Using unicode chars Pin
Tibor Blazko
2:39 26 Aug '09  
GeneralWhat are the license terms Pin
Dwayne Bailey
8:14 28 Jan '07  
GeneralProblem Creating a New Dictionary for MS Office Sort by Position Word List Pin
mfcuser
7:45 31 Aug '04  
GeneralRe: Problem Creating a New Dictionary for MS Office Sort by Position Word List Pin
Shaheer Ahmad
23:23 7 Dec '04  
GeneralRe: Problem Creating a New Dictionary for MS Office Sort by Position Word List Pin
mfcuser
3:48 8 Dec '04  
GeneralRe: Problem Creating a New Dictionary for MS Office Sort by Position Word List Pin
Shaheer Ahmad
4:56 8 Dec '04  
GeneralRe: Problem Creating a New Dictionary for MS Office Sort by Position Word List Pin
mlavaud2005
23:21 12 May '05  
GeneralRe: Problem Creating a New Dictionary for MS Office Sort by Position Word List Pin
mertart
23:18 14 May '05  
GeneralRe: Problem Creating a New Dictionary for MS Office Sort by Position Word List Pin
RakeshShivanna
21:50 5 Jun '06  
GeneralProblem running the code... Pin
deepblue1
4:44 29 May '04  
GeneralRe: Problem running the code... Pin
Tibor Blazko
20:59 6 Jun '04  
GeneralRe: Problem running the code... Pin
alfonso.gonzalez
6:55 14 Jul '05  
GeneralRe: Problem running the code... Pin
Tibor Blazko
6:59 15 Jul '05  
GeneralCSAPI 3 Dcoumentation Pin
schler
1:49 6 Jan '03  
GeneralCSAPI for Office 2000 and XP? Pin
Anonymous
9:10 19 Apr '02  
GeneralRe: CSAPI for Office 2000 and XP? Pin
Tibor Blazko
2:39 7 May '02  
GeneralRe: CSAPI for Office 2000 and XP? Pin
Luzius Schneider
4:49 15 May '02  
Generalspell checking problem Pin
Anonymous
2:22 13 Mar '02  
GeneralRe: spell checking problem Pin
real name
4:14 13 Mar '02  


Last Updated 14 Jun 2001 | Advertise | Privacy | Terms of Use | Copyright © CodeProject, 1999-2009