Solved

Borland Database Engine using SetConfigParameter to set NET DIR - Object not found Error

Posted on 2007-12-04
3
1,485 Views
Last Modified: 2010-07-27
I'm using SetConfigParameter in Delphi 5 to set the NET DIR but get Object not found error. Here's my code:

SetConfigParameter('\program files\common files\borland shared\bde\;NET DIR','\program files\common files\borland shared\bde\');

I'm using the code for the SetConfigParameter routine from the Borland website

Thanks
0
Comment
Question by:pauljackson5750
  • 2
3 Comments
 
LVL 13

Expert Comment

by:rfwoolf
ID: 20404217
I think the first parameter you're supplying is no good, try adding the drive letter, i.e.
SetConfigParameter('C:\program files\common files\borland shared\bde\;NET DIR','\program files\common files\borland shared\bde\');

personally I add DBTables to my uses clause of the form, then I say

session.netfiledir := 'c:\whatever';
0
 
LVL 13

Accepted Solution

by:
rfwoolf earned 125 total points
ID: 20404255
Okay here's what I found on the borland website and implemented to change the LOCAL SHARE to true.

The first is a general procedure to make changes to the BDE:

The second calls the procedure with the parameter to be set in the BDE config file...
procedure SetConfigParameter2(Param: string; Value: string);

var

  hCfg: hDBICfg;

  Config: SYSConfig;

  Path, Option: string;

  ParamCount, I: word;

  pFields, pFld: pFLDDesc;

  pRecBuf, pRec: pBYTE;

  Found, SelfInitialized: boolean;

  rslt: DBIResult;
 

begin

  {$Ifdef WIN32}

  hCfg := nil;

  pFld := nil;

  pRec := nil;

  Found := False;

  SelfInitialized := False;

  try

    if Pos(';', Param) = 0 then

      raise EDatabaseError.Create('Invalid parameter passed to function.  There must ' +

         'be a semi-colon delimited sting passed');

    Path := Copy(Param, 0, Pos(';', Param) - 1);

    Option := Copy(Param, Pos(';', Param) + 1, Length(Param) - Pos(';', Param));
 

    rslt := DbiGetSysConfig(Config);

    if rslt <> DBIERR_NONE then

    begin

      if rslt = DBIERR_NOTINITIALIZED  then // Engine not initialized error...

      begin

        SelfInitialized := True;

        DbiInit(nil);

        Check(DbiGetSysConfig(Config));

      end

      else

        Check(rslt);

    end;

    (* DbiOpenConfigFile is defined as such:

        function DbiOpenConfigFile (            { Open/Create configuration }

              pszDirPath    : PChar;            { Directory }

              bCreate       : Bool;             { TRUE to create/overwrite }

        var   hCfg          : hDBICfg           { Handle to config }

                           ): DBIResult stdcall; *)

    Check(DbiOpenConfigFile(Config.szIniFile, FALSE, hCfg));
 

    (* DbiCfgGetRecord is defined as such:

        function DbiCfgGetRecord (              { Get a record }

              hCfg          : hDBICfg;          { Config Handle/NULL }

              pszCfgPath    : PChar;            { Path }

        var   iFields       : Word;             { Returned nbr of fields }

              pfldDesc      : pFLDDesc;         { Field descriptors }

              pRec          : Pointer           { Field values }

                           ): DBIResult stdcall; *)

    { Call it without the field and record buffer to get the count... }

    Check(DbiCfgGetRecord(hCfg, PChar(Path), ParamCount, nil, nil));
 

    pFields := AllocMem(ParamCount * sizeof(FLDDesc));

    pFld := pFields;

    pRecBuf := AllocMem(10000);

    pRec := pRecBuf;
 

    { Get the node values... }

    Check(DbiCfgGetRecord(hCfg, PChar(Path), ParamCount, pFields, pRecBuf));
 

    for I := 0 to ParamCount - 1 do

    begin

      if pFields^.szName = Option then

      begin

        StrPCopy(PChar(pRecBuf), Value);
 

        (* DbiCfgModifyRecord is defines as such:

             function DbiCfgModifyRecord (           { Modify a record }

                   hCfg          : hDBICfg;          { Config Handle/NULL }

                   pszCfgPath    : PChar;            { Path }

                   iFields       : Word;             { Nbr of fields }

                   pfldDesc      : pFLDDesc;         { Field descriptors }

                   pRec          : Pointer           { Data values }

                ): DBIResult stdcall; *)

        Check(DbiCfgModifyRecord(hCfg,  PChar(Path), ParamCount, pFld, pRec));
 

        Found := True;

     end;

      Inc(pFields);

      Inc(pRecBuf, 128);

    end;

    if Found = False then

      raise EDatabaseError.Create(Param + ' entry was not found in configuration file');
 

  finally

    if pFld <> nil then

      FreeMem(pFld);

    if pRec <> nil then

      FreeMem(pRec);

    if hCfg <> nil then
 

    (* DbiCloseConfigFile is defined as such:

           function DbiCloseConfigFile (           { Close the config file }

           var   hCfg          : hDBICfg;          { Handle }

                 bSave         : Bool;             { To save the changes }

                 bDefault      : Bool;             { To make this file the default }

                 bSaveAs16     : Bool              { To save as a 16-bit config file }

              ): DBIResult stdcall; *)

      { Close and save the config file... }

    Check(DbiCloseConfigFile(hCfg, TRUE, TRUE, FALSE));

    if SelfInitialized = True then

      DbiExit;

  end;

  {$Else}

     raise EDatabaseError.Create('Non supported function in 16 bit');

  {$EndIf}

end;
 
 
 
 
 
 
 

===============================================================
 
 
 
 
 

  //Set LOCAL SHARE TO TRUE

SetConfigParameter2('\SYSTEM\INIT\;LOCAL SHARE', 'TRUE');

Open in new window

0
 

Author Closing Comment

by:pauljackson5750
ID: 31412922
Used the session.netfiledir := getcurrentdir and it seems to work.

Many thanks
0

Featured Post

IT, Stop Being Called Into Every Meeting

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

Join & Write a Comment

Hello everybody This Article will show you how to validate number with TEdit control, What's the TEdit control? TEdit is a standard Windows edit control on a form, it allows to user to write, read and copy/paste single line of text. Usua…
In my programming career I have only very rarely run into situations where operator overloading would be of any use in my work.  Normally those situations involved math with either overly large numbers (hundreds of thousands of digits or accuracy re…
Get a first impression of how PRTG looks and learn how it works.   This video is a short introduction to PRTG, as an initial overview or as a quick start for new PRTG users.
Here's a very brief overview of the methods PRTG Network Monitor (https://www.paessler.com/prtg) offers for monitoring bandwidth, to help you decide which methods you´d like to investigate in more detail.  The methods are covered in more detail in o…

760 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

18 Experts available now in Live!

Get 1:1 Help Now