Что такое код writeprivateprofilestring

WritePrivateProfileString не добавляет права до конца

Я пишу некоторые свойства в ini файле, используя функцию WritePrivateProfileString , и все работает нормально, но когда я добавляю текст с несколькими строками, возникает проблема.

Вот код и вывод.

Но когда после добавления нескольких позиций я добавляю другой элемент, вместо добавления этого конца добавляет новую строку сразу после адресной строки

но выход должен быть

Что такое проблема с моим кодом?

2 ответа

4 Решение 0xC0000022L [2012-07-12 15:31:00]

Я настоятельно рекомендую вам прочитать ваши проблемы в блоге Майкла Каплана.

Если вам абсолютно необходимо использовать INI файлы, не используйте устаревшие функции API Win32, которые вы используете прямо сейчас. Они ошибочны, и ошибки наверняка не будут исправлены больше, поскольку они устарели.

Вместо этого используйте SimpleIni очень приличную кросс-платформенную реализацию считывателя/записи INI для С++.

Microsoft (в целом), похоже, не уверена, предпочитают ли они реестр или другие механизмы для хранения данных конфигурации. В какой-то момент это были файлы INI, тогда это был реестр (для меня был превосходный механизм), а затем он, похоже, переключился на XML и другие механизмы хранения на основе файлов. Это, безусловно, ваш случай использования, который определит, что вам нужно, но учтите все слова осторожности при использовании этих устаревших функций и , по крайней мере, посмотрите на альтернативный механизм работы с INI файлом, если вам нужно.

2 Gunner [2012-07-13 02:46:00]

Хорошо, что это не правильный формат для INI файла для функций API, что вы ожидаете?

Формат для INI файла:

Если вы хотите использовать вызовы ini API, вы должны придерживаться формата. Вы хотите, чтобы город, улица и дом были частью города? Затем поместите их все на «ту же строку» и используйте разделитель, который вы можете позже проанализировать для каждого поля. Вы могли бы использовать запятую, трубку или что-нибудь еще, что не будет частью текста.

WritePrivateProfileString работает в основном, но не в функции

Я пытаюсь использовать WritePrivateProfileString и GetPrivateProfileInt для .ini синтаксический анализатор.

Когда я положил код ниже в main() или в конструктор класса, он работает для записи и чтения.

Но когда я делаю функции для записи и чтения, и вызываю функции в main() ничего не происходит, хотя функции запускаются как они cout что-то, если я попрошу их.

Вот тестовая программа, которую я написал, чтобы продемонстрировать это:

Приведенный выше код создает, а затем редактирует .ini файл, как ожидается.

Однако, если я переместу код в класс, он больше не будет работать.

Приведенный выше код создает .ini файл, но он не редактирует его и ничего не возвращает.

Решение

Вы не должны использовать fstream вообще создать / открыть файл INI вручную. WritePrivateProfileString() а также GetPrivateProfileInt() справиться с этим для вас.

Кроме того, если вы прочитаете их документацию, вы увидите, что НЕ ДОЛЖНЫ использовать относительный путь для INI-файла, иначе файл будет относиться к папке установки Windows, а не к папке вашего приложения. Итак, вы, вероятно, читаете / пишете INI-файл, но не там, где вы ожидаете от / до. Если вы хотите, чтобы ваш INI-файл был относительно папки вашего приложения, вам нужно получить путь к папке вашего приложения 1 и добавьте к нему имя файла INI.

Илон Маск рекомендует:  Iis приступая к работе с internet information services 5 0

1 Хотя это вообще не очень хорошая идея. В зависимости от того, где вы устанавливаете ваше приложение, пользователь может не иметь права записи в эту папку. Вы должны вместо этого использовать SHGetFolderPath() или же SHGetKnownFolderPath() чтобы получить локальный пользователя %AppData% папку, затем создайте свою собственную подпапку внутри нее, а затем создайте свой INI-файл внутри этой подпапки.

Попробуйте это вместо этого:

Основная причина вашего INIParser класс терпит неудачу, потому что ваш конструктор хранит путь к файлу INI в локальной переменной с именем configstring вместо того, чтобы в классе член также назвал configstring , Таким образом, член класса является пустым, когда WriteINI() а также ReadINI() называются.

Что такое код writeprivateprofilestring

В этой статье я хочу рассказать и показать как можно работать с INI-файлами в программах, написанных на C#. На самом деле, сейчас INI-файлы используются достаточно редко. Точнее они используются редко в разрабатываемых сейчас программах, но есть огромное количество программ, который были написаны весьма давно, в пору популярности INI-файлов. И Вам может даже придется сопровождать такие программы (как мне в своё время), или же Вам нужно будет организовать доступ из своей программы к INI-файлу, который создается другой системой. В любом случае, умение работать с INI-файлами является еще актуальной задачей…

И так, для начала, вкратце, расскажу о том, что же такое INI-файлы. В INI-файлах некоторые приложения хранят свои настройки. В общих чертах, формат INI-файла выглядит так:

Т.е. весь файл разбит на секции, а каждая секция включает в себя пары «ключ=значение». Пример файла для хранения краткой информации о человеке представлен ниже:

Как несложно догадаться, в файле хранятся имя и возраст человека, оба параметра расположены в секции «main». Так вот с подобными файлами, Вы можете столкнуться. А сейчас пора перейти к практической части статьи. Ниже я приведу класс, который импортирует две функции из библиотеки Windows и с их помощью получает/записывает настройки из INI-файла.

Обратите внимание, для использования данного кода, нужно подключить пространство имен «System.Runtime.InteropServices». В самом начале файла с исходным кодом есть список директив «using», вот в него нужно добавить строчку «using System.Runtime.InteropServices», как показано на примере ниже (нужная строка выделена):

Как видите, код приведен с комментариями, так что останавливаться на нем не буду, а лучше покажу как использовать объекты данного класса:

Как видите, тоже нет ничего сложного. Такой класс, можно включить в отдельную dll и использовать в разный проектах.

Добавить комментарий Отменить ответ

Для отправки комментария вам необходимо авторизоваться.

Что такое код writeprivateprofilestring

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

У меня такая проблема, нужно добавить в файл system.ini, который в директории Windows, одно значение в секцию Shell. Проблема в том, что класс TIniFile не справляется, просто не добавляет. В сети нашёл функцию, которая в названии топа, только вот непонятное какое-то описание.

Илон Маск рекомендует:  SeekEof - Функция Delphi

Описание:
function WritePrivateProfileString(ApplicationName, KeyName, Str, Filename:
PChar): Bool;

Ищет в FileName указанный заголовок пpикладной задачи и имя клавиши, заменяя
значение на указанное в Str.

Паpаметpы:
ApplicationName: Имя заголовка пpикладной задачи.
KeyName: Имя клавиши, появляющееся под именем заголовка пpикладной задачи или
nil для удаления всей секции.
Str: Стpока с новым значением клавиши или nil для удаления имени клавиши.

Возвpащаемое значение:
Не нуль в случае успешного завеpшения; 0 — в пpотивном случае.

функция находится в файле kernel32.dll

Какие-то клавиши под заголовками прикладных задач.
Всё это надо мне за тем, чтобы добавить файл в автозагрузку. Именно таким образом.

Что такое код writeprivateprofilestring

1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

The WritePrivateProfileString function copies a string into the specified section of an initialization file.

Note This function is provided only for compatibility with 16-bit versions of Windows. Applications should store initialization information in the registry.

BOOL WritePrivateProfileString(
LPCTSTR lpAppName,
LPCTSTR lpKeyName,
LPCTSTR lpString,
LPCTSTR lpFileName
);

Parameters
lpAppName
[in] Pointer to a null-terminated string containing the name of the section to which the string will be copied. If the section does not exist, it is created. The name of the section is case-independent; the string can be any combination of uppercase and lowercase letters.
lpKeyName
[in] Pointer to the null-terminated string containing the name of the key to be associated with a string. If the key does not exist in the specified section, it is created. If this parameter is NULL, the entire section, including all entries within the section, is deleted.
lpString
[in] Pointer to a null-terminated string to be written to the file. If this parameter is NULL, the key pointed to by the lpKeyName parameter is deleted.
Windows Me/98/95: The system does not support the use of the TAB (\t) character as part of this parameter.
lpFileName
[in] Pointer to a null-terminated string that specifies the name of the initialization file.

Использование WritePrivateProfileString написать вопрос путь

Я использую WritePrivateProfileString в C # (через DllImport) для хранения путей, взятых из текстовых полей на границе раздела. И имя INI-файл зашито в моем приложении

Однако, когда запись файла происходит, конфигурационный файл записывается на первый путь, взятый из интерфейса, а не писать его в директорию EXE. Что довольно странно. Отладка показывает, что значения передаются правильно в WritePrivateProfileString, но она по-прежнему записывается в неправильном месте. Любой знает, почему это happenening?

В дополнение к ответу Дэвида Хеффернэн — вы сможете использовать

безопасно получить папку часть только погонных приложения.

Илон Маск рекомендует:  Линия-градиент. Свойство background-image для линии

Если вы находитесь в библиотеке DLL, а не исполняемый файл, вы можете использовать

Оба они требуют System.IO , и первоначально были размещены здесь . Второй пример также требует System.Reflection ).

Я думаю , что что — то меняется рабочий каталог вашего процесса, скорее всего кода в процессе. Обратите внимание , что документация имеет это сказать:

Если параметр lpFileName не содержит полный путь и имя файла для файла, WritePrivateProfileString поиск в каталоге Windows, для файла. Если файл не существует, эта функция создает файл в каталоге Windows.

Теперь я думаю, что это относится , если вы укажете только имя файла. Потому что ваше имя файла начинается с . Я считаю , что заставит функцию , чтобы начать с текущего рабочего каталога.

Не Сказав все это, и независимо от того, какова причина этой проблемы, вы должны использовать полный путь для того, чтобы убедиться, что файл записывается, где вы хотите, чтобы это было написано. Всякий раз, когда вы хотите, чтобы файл идти в определенном каталоге, это всегда легче заставить, что при использовании полностью квалифицированные путей.

Прочитайте онлайн СПРАВОЧНИК ПО WinAPI | WritePrivateProfileString

Описание: function WritePrivateProfileString(ApplicationName, KeyName, Str, Filename:

Ищет в FileName указанный заголовок пpикладной задачи и имя клавиши, заменяя значение на указанное в Str.

Паpаметpы:

ApplicationName: Имя заголовка пpикладной задачи.

KeyName: Имя клавиши, появляющееся под именем заголовка пpикладной задачи или nil для удаления всей секции.

Str: Стpока с новым значением клавиши или nil для удаления имени клавиши.

Возвpащаемое значение:

Не нуль в случае успешного завеpшения; 0 — в пpотивном случае. функция находится в файле kernel32.dll

Что такое код writeprivateprofilestring

Eugenio » 15.10.2005 (Сб) 11:56

Amed » 15.10.2005 (Сб) 12:03

tyomitch » 15.10.2005 (Сб) 12:17

И в чём разница с оригиналом?

А я бы написал
Код: Выделить всё Public Declare Function WritePrivateProfileString _
Lib «kernel32» Alias «WritePrivateProfileStringA» _
(ByVal lpAppName As String, _
ByVal lpKeyName As Any, ByVal lpString As String, _
ByVal lpFileName As String) As Long

If Len(StrParamData) = 0 Then
lngResult = WritePrivateProfileString(SECTION_NAME, StrParamName, vbNullString, ConfigFileName)

Amed » 15.10.2005 (Сб) 12:28

Разница в том, что оригинал не работает.

В чем выгода твоего способа?
Ага, уже вижу LPCTSTR.

Eugenio » 15.10.2005 (Сб) 12:52

WritePrivateProfileString

Описание

function WritePrivateProfileString(ApplicationName, KeyName, Str, Filename: PChar): Bool;

Ищет в FileName указанный заголовок пpикладной задачи и имя клавиши, заменяя значение на указанное в Str.

Паpаметpы

  • ApplicationName: Имя заголовка пpикладной задачи.
  • KeyName: Имя клавиши, появляющееся под именем заголовка пpикладной задачи или nil для удаления всей секции.
  • Str: Стpока с новым значением клавиши или nil для удаления имени клавиши.

Возвpащаемое значение

Не нуль в случае успешного завеpшения; 0 — в пpотивном случае.

ВИДЕОКУРС
выпущен 4 ноября!

Описание:
function WritePrivateProfileString(ApplicationName, KeyName, Str, Filename:
PChar): Bool;

Ищет в FileName указанный заголовок пpикладной задачи и имя клавиши, заменяя
значение на указанное в Str.

Паpаметpы:
ApplicationName: Имя заголовка пpикладной задачи.
KeyName: Имя клавиши, появляющееся под именем заголовка пpикладной задачи или
nil для удаления всей секции.
Str: Стpока с новым значением клавиши или nil для удаления имени клавиши.

Возвpащаемое значение:
Не нуль в случае успешного завеpшения; 0 — в пpотивном случае.

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL