Как бы сделать перезагрузку функции в 4-ке ?

 

Проблема вылезла при обработке ini-файлов. Win32API позволяет записывать (ну и читать конечно) в инифайлы данные, а также удалять их оттуда. К сожалению делается это разными функциями но с одним и тем же именем и разными параметрами. Чтобы записать строку - один из параметров должен быть собственно строкой. Чтобы удалить этот параметр - вместо строки с ее значением нужно передать long 0.

вот скрипт который записывает данные в инифайл

#property copyright "Copyright © 2006-2010, Sergey Kravchuk. http://forextools.com.ua"
#property link  "http://forextools.com.ua"

#import "kernel32.dll"
  int WritePrivateProfileStringA ( string SectionName, string KeyName, string sString, string FileName);      
#import

int WriteIniString(string FileName, string SectionName, string KeyName, string Default = "")
{
  return(WritePrivateProfileStringA(SectionName, KeyName, Default, FileName));
}

int start()
{
  string FileName = "d:\Write.ini";
  WriteIniString (FileName, "Секция1", "Ключ1", TimeToStr(TimeLocal(), TIME_SECONDS)); 
  WriteIniString (FileName, "Секция1", "Ключ2", TimeToStr(TimeCurrent(), TIME_SECONDS)); 
  WriteIniString (FileName, "Секция1", "Ключ2", 0); 
  WriteIniString (FileName, "Секция2", "Ключ1", AccountServer()); 
}

по идейке строчка

  WriteIniString (FileName, "Секция1", "Ключ2", 0); 

должна былабы удалить значение Ключ2, но вместо этого она прописывает туда строку "0" (оно и понятно - сработало неявное преобразование типов). если задать пустую строку "" то и получим ключ с пустой строкой.

вот другой скрипт который удаляет ключ

#property copyright "Copyright © 2006-2010, Sergey Kravchuk. http://forextools.com.ua"
#property link  "http://forextools.com.ua"

#import "kernel32.dll"
  int WritePrivateProfileStringA ( string SectionName, string KeyName, int zero, string FileName);      
#import

int WriteIniString(string FileName, string SectionName, string KeyName, string Default = "")
{
  return(WritePrivateProfileStringA(SectionName, KeyName, Default, FileName));
}

int start()
{
  string FileName = "d:\Write.ini";
  WriteIniString (FileName, "Секция1", "Ключ2", 0); 
}

подскажите кто знает как организовать "перегрузку функции" WritePrivateProfileStringA чтобы ей можно было передать в одном и том же параметре и строку для записи ключа (string sString) и целое для удаления ключа (int zero)? или как передать ей такую строку, которую WritePrivateProfileStringA воспримет как long 0?

ну или какйото другой способ как удалить ключ из секции?

Файлы:
ini.zip  1 kb
 
#import "kernel32.dll"
  int WritePrivateProfileStringA ( string SectionName, string KeyName, int zero, string FileName);   
  int WritePrivateProfileStringA ( string SectionName, string KeyName, string sString, string FileName);  
#import
Попробуйте, объявить две функции.
 

если бы все было так просто - я бы не задавал вопрос ;)

срабатывает только одно ПЕРВОЕ (по тексту) описание :(

 

На самом деле WritePrivateProfileString принимает в качестве третьего параметра указатель, и в принципе ничто не мешает нам подставить ей любой массив, например int lpString[]. Попробуй объявить прототип с таким параметром и формируй его в зависимости от нужд: для передачи строки потребуется написАть отдельную функцию по преобразованию строки в int-массив - это несложно. Ну а ноль передать просто через lpString[0]=0;

 

Боян! Надо передавать неинициализированный стринг.

 
Integer:

Боян! ...

а можно работающий код в качестве примера?
 
Integer:

Боян! Надо передавать неинициализированный стринг.

но всегда иметь в виду, что в очередном билде поведение неинициализированных переменных может раз!- и измениться:)
 
ForexTools:
а можно работающий код в качестве примера?
string a;
WriteIniString (FileName, "Секция1", "Ключ2", a); 
 
alsu:

благодарю за помощь - действительно работает.

#property copyright "Copyright © 2006-2010, Sergey Kravchuk. http://forextools.com.ua"
#property link  "http://forextools.com.ua"

#import "kernel32.dll"
  int WritePrivateProfileStringA ( string SectionName, string KeyName, string sString, string FileName);      
#import

int WriteIniString(string FileName, string SectionName, string KeyName, string Default = "")
{
  return(WritePrivateProfileStringA(SectionName, KeyName, Default, FileName));
}

int start()
{
  string FileName = "d:\Write.ini";
  string zero;
  WriteIniString (FileName, "Секция1", "Ключ1", TimeToStr(TimeLocal(), TIME_SECONDS)); 
  WriteIniString (FileName, "Секция1", "Ключ2", TimeToStr(TimeCurrent(), TIME_SECONDS)); 
  WriteIniString (FileName, "Секция1", "Ключ2", zero); 
  WriteIniString (FileName, "Секция2", "Ключ1", AccountServer()); 
}
 
ForexTools:

благодарю за помощь - действительно работает.

благодари Дмитрия
Причина обращения: