Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нужен пример кода, на WinApi 
:(
    Опции темы
ama_kid
Дата 20.3.2008, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 5
Всего: 95



Цитата(russians @  20.3.2008,  11:04 Найти цитируемый пост)
Как определить локальную папку нахождения программы?
С помощью GetModuleFileName. К примеру так: 
Код

    char *pdest;
    char m_AppPath[MAX_PATH];
    GetModuleFileName(NULL,m_AppPath,MAX_PATH);
    pdest = strrchr(m_AppPath, '\\');    // ищем последний бэкслэш 
    *pdest = '\0';                   // обрезаем лишнее




--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
russians
Дата 21.3.2008, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 297
Регистрация: 6.11.2006

Репутация: нет
Всего: нет



И последнее, я видел стандартный алгоритм замены подстроки в строке для С++, но сейчас никак найти не могу, только для Delphi, помогите найти, а... последний пункт выполнения :(((

P.S. сам написать не могу, времени нет, паяю smile Задача, открыть .reg файл, прогнать его на слова, позаменять их на имя папки и сохранить.

P.P.S.
Нашёл кусок кода, только он не рабочий:
Код

TStringList* list = new TStringList;
list->LoadFromFile("httpd.conf");
 for(int x=0;x<list->Count;x++)
 {
 list->Add(StringReplace(list->Strings[x], "path_to", "newpath_to", TReplaceFlags() << rfReplaceAll));
 }
list->SaveToFile("httpd1.conf");


P.P.S. Вот ещё один smile
Код

int string_replace(char *string, const char *delimiter, const char *replacement)
{
int bret = 0;
char *ret;
int length_del, length_rep, i, j;

if (string == NULL || delimiter == NULL || replacement == NULL)
return 0;

length_del = strlen(delimiter);
length_rep = strlen(replacement);

/* Count how many times the delimiter appears */
i = 0; /* position in the source string */
j = 0; /* number of occurrences of "delimiter" */
while (string[i] != '\0') {
if (!strncmp(&string[i], delimiter, length_del)) {
i += length_del;
j += length_rep;
bret = 1;
} else {
i++;
j++;
}
}

if (!bret)
return bret;

ret = malloc(j+1);
if (!ret)
return 0;

i = 0; /* position in the source string */
j = 0; /* position in the destination string */
while (string[i] != '\0') {
if (!strncmp(&string[i], delimiter, length_del)) {
strncpy(&ret[j], replacement, length_rep);
i += length_del;
j += length_rep;
} else {
ret[j] = string[i];
i++;
j++;
}
}

ret[j] = '\0';

strcpy(string, ret);
free(ret);

return bret;
}


Это сообщение отредактировал(а) russians - 21.3.2008, 10:22
PM MAIL   Вверх
ama_kid
Дата 21.3.2008, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 5
Всего: 95



Цитата(russians @  21.3.2008,  10:09 Найти цитируемый пост)
Задача, открыть .reg файл, прогнать его на слова, позаменять их на имя папки и сохранить.
Опиши задачу и конечную цель более подробно, вполне возможно её можно решить более простым методом, чем выцеплять слова из файла. К примеру, генерировать файл с уже правильным именем папки. Или заменой прям в реестре... Ну и все-таки старайся соблюдать правила форума, в частности п.10:
Цитата
На каждый вопрос должна создаваться отдельная тема.
Рекомендую создать отдельный топик с подробным разъяснением проблемы в соответствующую ветку форума, тогда вероятность получения качественного ответа возрастёт...



--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
russians
Дата 21.3.2008, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 297
Регистрация: 6.11.2006

Репутация: нет
Всего: нет



ama_kid, в общем, большая часть задачи выполнена. Дело в том, что при обработке карты *.img cgpsmapper создаёт три файла, один из которых *.Reg. Для работы с картой в MapSource нужно изменить файл Reg и испортировать его в регистр.
Reg файл с именем, которое задано в графе CardnAME изначально, корректится следующим образом
Код

REGEDIT4

[HKEY_LOCAL_MACHINE\SOFTWARE\Garmin\MapSource\Products\GlobalMapDefault] //GlobalMapDefault меняется на значение ProductCode, например, 200
"LOC"="C:\\myMaps\\imgs\\" //myMaps меняется на локальную директорию
"BMAP"="C:\\myMaps\\GlobalMapDefault.img" //myMaps меняется на локальную директорию
"TDB"="C:\\myMaps\\GlobalMapDefault.tdb" //myMaps меняется на локальную директорию


Вот и всё smile А по поводу правила, это всё части одной задачи. Откуда же я знал, что тут такой гемморой с выцеплением слов *глядя на второй алгоритм*.

P.S. В процессе работы обнаружил недостаток WinExec, который запускает файл: Reg файл должен редактироваться после создания, а программа не дожидаясь конца работы WinExec идёт дальше по алгоритму :(

Это сообщение отредактировал(а) russians - 21.3.2008, 11:49
PM MAIL   Вверх
ama_kid
Дата 21.3.2008, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 5
Всего: 95



Цитата(russians @  21.3.2008,  11:04 Найти цитируемый пост)
Для работы с картой в MapSource нужно изменить файл Reg и испортировать его в регистр.
Мне почему-то кажется, что это все можно заменить на банальную работу с реестром - вместо геморройного парсинга файла (который, кстати, может быть и в юникоде) выполнить простую операцию записи необходимых ключей в реестр (или модификации, если такие ключи уже существуют)...



--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
russians
Дата 21.3.2008, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 297
Регистрация: 6.11.2006

Репутация: нет
Всего: нет



ama_kid, увы, с реестром не работал :( Для MapSource неважно, файл ли это или не файл, важно, чтобы была запись в реестре с ключом в Products соответственно тому файлу, который я уже приводил с соответствующими заменами... smile
Я так понял, тут нужно подключать MFC библиотеки... 
Код

CString strSection = "Моя секция";
CString strStringItem = "Мой строковый элемент";
CString strIntItem = "Мой целый элемент";

CWinApp* pApp = AfxGetApp();
pApp->WriteProfileString(strSection, strStringItem, "test");

CString strValue;
strValue = pApp->GetProfileString(strSection, strStringItem);
ASSERT(strValue == "test");

pApp->WriteProfileInt(strSection, strIntItem, 1234);
int nValue;
nValue = pApp->GetProfileInt(strSection, strIntItem, 0);
ASSERT(nValue == 1234);

CWinApp::WriteProfileString
BOOL WriteProfileString( LPCTSTR lpszSection, LPCTSTR lpszEntry, LPCTSTR lpszValue );


Это сообщение отредактировал(а) russians - 21.3.2008, 12:40
PM MAIL   Вверх
ama_kid
Дата 21.3.2008, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 5
Всего: 95



russians, гаспоть с табой, зачем MFC тащить, если все есть в WinAPI? Вот пример работы с реестром из моих программ, посмотри, поизучай...
Код
DWORD RegGetDWORDValue(HKEY Root, LPCTSTR SubKey, LPCTSTR Key)
{    HKEY hKey = 0;
    DWORD nSize = 10;
    char buf[10]="";
    DWORD *Value;
    
    if (RegOpenKeyEx(Root,SubKey,0,KEY_READ,&hKey)==ERROR_SUCCESS)
    {
        if (RegQueryValueEx(hKey, Key, NULL, NULL, (LPBYTE)buf, &nSize)==ERROR_SUCCESS)
        {
            Value = (DWORD *) buf;
            RegCloseKey(hKey);
            return *Value;
        } else
        {
            RegCloseKey(hKey);
            return ERROR_VALUE_NOT_EXISTS;
        }
    } else
    {
        //MessageBox( hWnd_Global, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION );
        return ERROR_VALUE_NOT_EXISTS;
    }
}

char *RegGetStringValue(HKEY Root, LPCTSTR SubKey, LPCTSTR Key)
{    HKEY hKey = 0;
    DWORD nSize = 20;
    char buf[20]="";
    char *Value;
    
    if (RegOpenKeyEx(Root,SubKey,0,KEY_READ,&hKey)==ERROR_SUCCESS)
    {
        if (RegQueryValueEx(hKey, Key, NULL, NULL, (LPBYTE) &buf, &nSize)==ERROR_SUCCESS)
        {
            Value = (char *) buf;
            RegCloseKey(hKey);
            return Value;
        } else
        {
            RegCloseKey(hKey);
            return "";
        }
    } else
    {
        //MessageBox( hWnd_Global, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION );
        return "";
    }
}

bool RegSetDWORDValue(HKEY Root, LPCTSTR SubKey, LPCTSTR Key, DWORD iValue)
{    HKEY hKey = 0;
    DWORD nSize = 10;
    
    if (RegOpenKeyEx(Root,SubKey,0,KEY_WRITE,&hKey)==ERROR_SUCCESS)
    {
        if (RegSetValueEx(hKey, Key, 0, REG_DWORD, (LPBYTE) &iValue, 4)!=ERROR_SUCCESS)
        {
            RegCloseKey(hKey);
            return FALSE;
        }
        RegCloseKey(hKey);
        return TRUE;
    } else
    {
        //MessageBox( hWnd_Global, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION );
        return FALSE;
    }
}
Не нашел у в себя функции для записи в реестр строк - она делается аналогично записи слова, смотри хелп по RegSetValueEx - там есть пример организации записи строк в реестр...


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
russians
Дата 21.3.2008, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 297
Регистрация: 6.11.2006

Репутация: нет
Всего: нет



ama_kid, дык, код немаленький smile Хочеца одын функция для запросов smile
PM MAIL   Вверх
ama_kid
Дата 21.3.2008, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 5
Всего: 95



Цитата(russians @  21.3.2008,  14:08 Найти цитируемый пост)
Хочеца одын функция для запросов
Как же ты пишешь на С++ с таким дельфийским подходом?  smile  Я же тебе всю инфу дал, чтобы это сделать smile
Ладно, вот навалял по-быстрому:
Код
bool RegSetStringValue(HKEY Root, LPCTSTR SubKey, LPCTSTR Key, char *sValue)
{    
    HKEY hKey = 0;
    
    RegCreateKey(Root,SubKey,&hKey);
    bool hr = RegSetValueEx(hKey, Key, 0, REG_SZ, (LPBYTE) sValue, (DWORD)strlen(sValue)+1 )==ERROR_SUCCESS;
    RegCloseKey(hKey);
    return hr;
}
... // Пример вызова
char szKeyName[MAX_PATH] ="SOFTWARE\\PROGRAM\\Point";
char szFieldName[MAX_PATH] = "Key1";
char szFieldValue[MAX_PATH] = "Key Value 1";

RegSetStringValue(HKEY_LOCAL_MACHINE,szKeyName,szFieldName,szFieldValue);




--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
russians
Дата 21.3.2008, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 297
Регистрация: 6.11.2006

Репутация: нет
Всего: нет



ama_kid, я просто обленился вот и всё smile  smile 
Отказыается этот код работать :(
Код

            char *pdest;
            char m_AppPath[MAX_PATH];
            GetModuleFileName(NULL,m_AppPath,MAX_PATH);
            pdest = strrchr(m_AppPath, '\\');
            *pdest = '\0';
char szKeyName[MAX_PATH] ="";
strcpy(szKeyName,"SOFTWARE\\Garmin\\MapSource\\Products");
strcpy(szKeyName,ProductCode);
char szFieldName[MAX_PATH] = "LOC";
char szFieldValue[MAX_PATH] = "";
strcpy(szFieldValue,pdest);
RegSetStringValue(HKEY_LOCAL_MACHINE,szKeyName,szFieldName,szFieldValue);
szFieldName[MAX_PATH] = "BMAP";
szFieldValue[MAX_PATH] = "";
strcpy(szFieldValue,pdest);
strcpy(szFieldValue,"\\");
strcpy(szFieldValue,CardName);
strcpy(szFieldValue,".img");
RegSetStringValue(HKEY_LOCAL_MACHINE,szKeyName,szFieldName,szFieldValue);
szFieldName[MAX_PATH] = "TDB";
szFieldValue[MAX_PATH] = "";
strcpy(szFieldValue,pdest);
strcpy(szFieldValue,"\\");
strcpy(szFieldValue,CardName);
strcpy(szFieldValue,".tdb");
RegSetStringValue(HKEY_LOCAL_MACHINE,szKeyName,szFieldName,szFieldValue);
}


Вот :( Может быть дело  в Strcpy?
224 C:\Mapsoft\main.cpp invalid conversion from `const char*' to `char' 
225 C:\Mapsoft\main.cpp invalid conversion from `const char*' to `char' 
232 C:\Mapsoft\main.cpp invalid conversion from `const char*' to `char' 

Это сообщение отредактировал(а) russians - 21.3.2008, 16:25
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0534 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.