LB Booster
« INI deletions »

Welcome Guest. Please Login or Register.
Apr 1st, 2018, 04:47am



ATTENTION MEMBERS: Conforums will be closing it doors and discontinuing its service on April 15, 2018.
We apologize Conforums does not have any export functions to migrate data.
Ad-Free has been deactivated. Outstanding Ad-Free credits will be reimbursed to respective payment methods.

Thank you Conforums members.
Speed up Liberty BASIC programs by up to ten times!
Compile Liberty BASIC programs to compact, standalone executables!
Overcome many of Liberty BASIC's bugs and limitations!
LB Booster Resources
LB Booster documentation
LB Booster Home Page
LB Booster technical Wiki
Just BASIC forum
BBC BASIC Home Page
Liberty BASIC forum (the original)

« Previous Topic | Next Topic »
Pages: 1 2  Notify Send Topic Print
 hotthread  Author  Topic: INI deletions  (Read 1505 times)
joker
Global Moderator
ImageImageImageImageImage


member is offline

Avatar




PM

Gender: Male
Posts: 157
xx INI deletions
« Thread started on: Nov 25th, 2015, 11:35am »

In several places it is stated that either an "Entry" or a "Section" will be deleted if a corresponding value is "NULL". This deletion does not seem to be happening in my file today.

I can't find any way to delete a "Section" or an "Entry" other than to edit in a text editor.

I'm curious what has changed from then to now to make this no longer function, and is there a way to make that statement true?

LINK: http://lbpe.wikispaces.com/IniFiles

Quote:
Entry$
Points to a null-terminated string containing the entry associated with the value string. If the entry does not exist it will be created. If this is NULL (""), the entire section is deleted. If you were to read the file in a texteditor this entry would look like this -- the Entry$ followed by an = sign, followed by the String$

Entry=String
...
String$
Points to the null-terminated string value to be written to the file. If this is NULL, (""), the Entry$ entry is deleted from the file.

Entry=String


PS. Posted on the other forum, too.
User IP Logged

Richard Russell
Administrator
ImageImageImageImageImage


member is offline

Avatar




Homepage PM


Posts: 1348
xx Re: INI deletions
« Reply #1 on: Nov 25th, 2015, 1:05pm »

on Nov 25th, 2015, 11:35am, pnlawrence wrote:
In several places it is stated that either an "Entry" or a "Section" will be deleted if a corresponding value is "NULL". This deletion does not seem to be happening in my file today.

Strange, it seems to be working correctly for me. I ran the program below and both the 'entry' and the 'section' were deleted, by the respective statements (Windows 10, 64 bits):

Code:
    INIfile$ = DefaultDir$ + "\test.ini"
    
    calldll #kernel32, "WritePrivateProfileStringA", "MyApp" as ptr, _
        "MyKey" as ptr, "MyString" as ptr, INIfile$ as ptr, ret as long

    ' delete entry:
    calldll #kernel32, "WritePrivateProfileStringA", "MyApp" as ptr, _
        "MyKey" as ptr, _NULL as long, INIfile$ as ptr, ret as long        
        
    ' delete section:
    calldll #kernel32, "WritePrivateProfileStringA", "MyApp" as ptr, _
        _NULL as long, _NULL as long, INIfile$ as ptr, ret as long 

Quote:
If this is NULL ("")

NULL is not "", they are completely different things. If that's what it states at LBPE it is hopelessly confused and should be corrected. Note that LBB will let you write _NULL as ptr (which strictly is correct since NULL is a 'null pointer') but LB won't.

Richard.
« Last Edit: Nov 25th, 2015, 1:56pm by Richard Russell » User IP Logged

joker
Global Moderator
ImageImageImageImageImage


member is offline

Avatar




PM

Gender: Male
Posts: 157
xx Re: INI deletions
« Reply #2 on: Nov 25th, 2015, 2:18pm »

Of course, I'm trying to develop a function. :D

The function works fine in writing to the INI file, but I ran across the text about deleting and decided to test that out. So here I am.

I've tried explicit BYREF on all the string parameters of the function.

I can't see how to pass _NULL in a string variable without a type mismatch.

I tried chr$(0) in a string by itself. That didn't work.

So, it doesn't seem like anything that I pass to the function will accomplish this deletion unless I create the logic within the function by detecting a parameter that passes something ( chr$(0)? ) and then execute the line with "_NULL as long" in it.

What do you think about that?

Code:
function WriteINI(section$,entry$,string$,filename$)
    CallDLL #kernel32, "WritePrivateProfileStringA", _
    section$ As ptr, _
    entry$ As ptr, _
    string$ As ptr, _
    filename$ As ptr, _
    result As long
    WriteINI = result
end function
 


EDIT: The other forum went in and {halfheartedly} edited the LBPE section that I referenced.
« Last Edit: Nov 25th, 2015, 2:23pm by joker » User IP Logged

Richard Russell
Administrator
ImageImageImageImageImage


member is offline

Avatar




Homepage PM


Posts: 1348
xx Re: INI deletions
« Reply #3 on: Nov 25th, 2015, 3:09pm »

on Nov 25th, 2015, 2:18pm, pnlawrence wrote:
I can't see how to pass _NULL in a string variable without a type mismatch.

You could 'invent' a special unique string (it could be "", or it could be "NULL" or it could be anything at all that you are unlikely to want as the 'real' entry in an INI file, such as "DeleteThis"). Then within your FUNCTION you could test the string parameter to see if it is this special value; if it is you call the WritePrivateProfile... API with _NULL as the parameter and if not you call it normally.

If that doesn't appeal you can turn your question around. Although you can't pass _NULL in a string variable, you can pass a string via a numeric variable (using a NUL-terminated WINSTRING via a STRUCT). A bit messy, but it would work.

Richard.
« Last Edit: Nov 25th, 2015, 3:12pm by Richard Russell » User IP Logged

tsh73
Full Member
ImageImageImage


member is offline

Avatar




PM

Gender: Male
Posts: 210
xx Re: INI deletions
« Reply #4 on: Nov 25th, 2015, 4:17pm »

Quote:
{halfheartedly}

Haters gonna hate, yeah?

This article was originally posted in LB Newsletter in 2002.
Pretty sure no one tried to delete entry from INI file - that's not they are used for, normally.
So folks just had no idea.

You asked - you got attention of 3 different people never seen each other in real life - and in two hours article was corrected.

And you say {halfheartedly}.
;\
User IP Logged

joker
Global Moderator
ImageImageImageImageImage


member is offline

Avatar




PM

Gender: Male
Posts: 157
xx Re: INI deletions
« Reply #5 on: Nov 25th, 2015, 5:14pm »

tsh73, I said {halfheartedly} because the _NULL problem wasn't addressed in a way that would provide a solution. Looks like just the text was corrected.

It wasn't a personal cut, although you could read it that way.

If the article is so important, I think it is, then correct the whole article/code. No one is putting pressure on anyone to do it immediately.

"2002"? Hell, EVERYTHING is from around that era! cheesy
User IP Logged

Richard Russell
Administrator
ImageImageImageImageImage


member is offline

Avatar




Homepage PM


Posts: 1348
xx Re: INI deletions
« Reply #6 on: Nov 25th, 2015, 5:51pm »

on Nov 25th, 2015, 5:14pm, pnlawrence wrote:
If the article is so important, I think it is, then correct the whole article/code.

I've just checked LBPE myself, and I can't see any part of the article or the included code that is still incorrect. The choice of ULONG rather than LONG for the _NULL value is not one I would have made (obviously both types can hold the value zero, but I always prefer LONG because it is the more 'fundamental' type).

What section of the article do you consider not to have been fully corrected?

Richard.
User IP Logged

joker
Global Moderator
ImageImageImageImageImage


member is offline

Avatar




PM

Gender: Male
Posts: 157
xx Re: INI deletions
« Reply #7 on: Nov 25th, 2015, 6:21pm »

When I looked this morning, I didn't see the complete editing.

I should have waited until next month to look and comment, so there's enough time to finish.
User IP Logged

tsh73
Full Member
ImageImageImage


member is offline

Avatar




PM

Gender: Male
Posts: 210
xx Re: INI deletions
« Reply #8 on: Nov 25th, 2015, 7:20pm »

Quote:
tsh73, I said {halfheartedly} because the _NULL problem wasn't addressed in a way that would provide a solution. Looks like just the text was corrected.

OK
Quote:
It wasn't a personal cut

OK
Quote:
If the article is so important, I think it is (...)

I think important bit is this quote from MSDN:
Quote:
Note This function is provided only for compatibility with 16-bit versions of Windows. Applications should store initialization information in the registry.
User IP Logged

Richard Russell
Administrator
ImageImageImageImageImage


member is offline

Avatar




Homepage PM


Posts: 1348
xx Re: INI deletions
« Reply #9 on: Nov 25th, 2015, 8:02pm »

on Nov 25th, 2015, 7:20pm, tsh73 wrote:
I think important bit is this quote from MSDN: "This function is provided only for compatibility with 16-bit versions of Windows. Applications should store initialization information in the registry".

One of the sillier comments in MSDN! There are several reasons why one might want to use an INI file in preference to the registry:
  • Easily viewed by the user.

  • Easily and safely edited by the user.

  • Easily backup-up.

  • Easily shared, e.g. on a network server.

  • Simpler and safer API.

  • Discussion of registry access forbidden on the LB forum.
Personally I think the registry is best left for use by the Operating System. I do use it, for example BBC BASIC for Windows stores its settings there, but as a general rule I would suggest an application program should use an INI file in preference.

Richard.
« Last Edit: Nov 25th, 2015, 8:05pm by Richard Russell » User IP Logged

joker
Global Moderator
ImageImageImageImageImage


member is offline

Avatar




PM

Gender: Male
Posts: 157
xx Re: INI deletions
« Reply #10 on: Nov 25th, 2015, 8:55pm »

Uh oh.

Quote:
FileName$
Points to a null-terminated string that names the INI file. If this name is a fully-qualified path and file name, it will be used. If there is no path, Windows searches for the file in the Windows directory. If it doesn't exist, it will be created.


The API returns "0".

Why do these things not work for me? I'm always in trouble for bringing them up.
User IP Logged

Richard Russell
Administrator
ImageImageImageImageImage


member is offline

Avatar




Homepage PM


Posts: 1348
xx Re: INI deletions
« Reply #11 on: Nov 25th, 2015, 9:17pm »

on Nov 25th, 2015, 8:55pm, pnlawrence wrote:
The API returns "0".

By API I assume you mean WritePrivateProfileStruct. If the reason for the failure isn't obvious (and there aren't many things that could be wrong) you can call the Windows GetLastError and FormatMessage APIs to get a more detailed error report. You can borrow the displayError SUB from Anatoly's LBPE article for that purpose.

Quote:
Why do these things not work for me?

Insufficient attention to detail perhaps? Presumably you've checked that the INI file path you are supplying is valid and writable? If in doubt you can always try an ordinary OPEN for OUTPUT using the same path.

Richard.
User IP Logged

joker
Global Moderator
ImageImageImageImageImage


member is offline

Avatar




PM

Gender: Male
Posts: 157
xx Re: INI deletions
« Reply #12 on: Nov 25th, 2015, 10:30pm »

Detail? Me? cheesy

I suppose I wasn't clear. I bolded part of the quote in my previous post that states that Windows will find the file or create it.

That finding the file or creating it part doesn't work for me, attention to detail or not.

Please let me know whether you think it should exhibit this behavior or not.

Using this "calldll #kernel32, "WritePrivateProfileStringA", "MyApp" as ptr, "MyKey" as ptr, "MyString" as ptr, INIfile$ as ptr, ret as long"
User IP Logged

Richard Russell
Administrator
ImageImageImageImageImage


member is offline

Avatar




Homepage PM


Posts: 1348
xx Re: INI deletions
« Reply #13 on: Nov 25th, 2015, 11:04pm »

on Nov 25th, 2015, 10:30pm, pnlawrence wrote:
I suppose I wasn't clear.

You said that the function returned the value zero, and that is what I was responding to.

Quote:
That finding the file or creating it part doesn't work for me

Please list some code which illustrates the problem you are having.

Quote:
Please let me know whether you think it should exhibit this behavior or not.

If you mean does the function create the file if it doesn't already exist, then yes of course it does.

Richard.
« Last Edit: Nov 25th, 2015, 11:30pm by Richard Russell » User IP Logged

Rod
Full Member
ImageImageImage


member is offline

Avatar




PM

Gender: Male
Posts: 110
xx Re: INI deletions
« Reply #14 on: Nov 26th, 2015, 08:01am »

I have asked before that you print out your path and file name string. It will help us debug. If the Windows directory you mention in bold is a protected system directory then you won't have permission to access it. Just keep the .ini file in the project directory you do have access to. But show us the path and file name as it is used in the code.
User IP Logged

Pages: 1 2  Notify Send Topic Print
« Previous Topic | Next Topic »

| |

This forum powered for FREE by Conforums ©
Terms of Service | Privacy Policy | Conforums Support | Parental Controls