Click here to Skip to main content
Licence 
First Posted 22 May 2001
Views 129,370
Bookmarked 32 times

Using the Microsoft Common Spell API

By | 14 Jun 2001 | Article
An introduction to using the Microsoft CSAPI.

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.

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

About the Author

Tibor Blazko

Software Developer (Senior)

Slovakia Slovakia

Member



Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board. (secure sign-in)
 
Search this forum  
 FAQ
    Noise  Layout  Per page   
  Refresh
GeneralCSAPI3 Pinmemberleebauer0:55 2 Nov '09  
Questionhow to complile Pinmemberleebauer6:21 21 Oct '09  
AnswerRe: how to complile PinmemberTibor Blazko0:04 25 Oct '09  
Generalcreating local language spell cheking Pinmembertedkidane7:39 1 Oct '09  
GeneralRe: creating local language spell cheking PinmemberTibor Blazko9:21 1 Oct '09  
GeneralUsing unicode chars Pinmembermita555551:34 26 Aug '09  
GeneralRe: Using unicode chars PinmemberTibor Blazko1:39 26 Aug '09  
QuestionWhat are the license terms PinmemberDwayne Bailey7:14 28 Jan '07  
GeneralProblem Creating a New Dictionary for MS Office Sort by Position Word List Pinmembermfcuser6:45 31 Aug '04  
GeneralRe: Problem Creating a New Dictionary for MS Office Sort by Position Word List PinmemberShaheer Ahmad22:23 7 Dec '04  
GeneralRe: Problem Creating a New Dictionary for MS Office Sort by Position Word List Pinmembermfcuser2:48 8 Dec '04  
GeneralRe: Problem Creating a New Dictionary for MS Office Sort by Position Word List PinmemberShaheer Ahmad3:56 8 Dec '04  
GeneralRe: Problem Creating a New Dictionary for MS Office Sort by Position Word List Pinmembermlavaud200522:21 12 May '05  
GeneralRe: Problem Creating a New Dictionary for MS Office Sort by Position Word List Pinmembermertart22:18 14 May '05  
GeneralRe: Problem Creating a New Dictionary for MS Office Sort by Position Word List PinmemberRakeshShivanna20:50 5 Jun '06  
GeneralProblem running the code... Pinmemberdeepblue13:44 29 May '04  
GeneralRe: Problem running the code... PinmemberTibor Blazko19:59 6 Jun '04  
GeneralRe: Problem running the code... Pinmemberalfonso.gonzalez5:55 14 Jul '05  
GeneralRe: Problem running the code... PinmemberTibor Blazko5:59 15 Jul '05  
GeneralCSAPI 3 Dcoumentation Pinmemberschler0:49 6 Jan '03  
QuestionCSAPI for Office 2000 and XP? PinmemberAnonymous8:10 19 Apr '02  
AnswerRe: CSAPI for Office 2000 and XP? PinmemberTibor Blazko1:39 7 May '02  
GeneralRe: CSAPI for Office 2000 and XP? PinmemberLuzius Schneider3:49 15 May '02  
Unfortunately, the vc ole discussion article mentions only using MSWord automation for spell checking. It does not use the spell check engine (dll) directly. This is much to much overhead!
The CSAPI information above allows to use the dll directly (Word not required). Unfortunately, this works only for MSOffice 95/97 and for some few languages with MSOffice 2000.

Generalspell checking problem PinmemberAnonymous1:22 13 Mar '02  
GeneralRe: spell checking problem Pinmemberreal name3:14 13 Mar '02  

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

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

Permalink | Advertise | Privacy | Mobile
Web01 | 2.5.120529.1 | Last Updated 15 Jun 2001
Article Copyright 2001 by Tibor Blazko
Everything else Copyright © CodeProject, 1999-2012
Terms of Use
Layout: fixed | fluid