Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Нужен пример кода


Автор: russians 18.3.2008, 11:00
Добрый день. Поскольку под платформу Win я не разрабатывал ничего и никогда, то прошу участников форума: дайте пример кода, который формирует окно, на нём выставляет поле для ввода и кнопку. Задача такая: автоматизировать работу cgpsmapper, ибо заманало каждый раз создавать конфиг smile Конфиг pv.txt следующего содержания:

Код

[Map]
FileName=Italy
MapVersion=100
ProductCode=5 
Levels=2
Level0=15
Level1=13
Zoom0=7
Zoom1=8
MapsourceName=Italy
MapSetName=Italy
CDSetName=Italy
Copy1=Garmin
Copy2=Garmin
[End-Map]

[Files]
img=C:\Mapsoft\11000014.img
[END-Files]


Необходимо после формирования конфига запускать файл из консоли с параметром pv pv.txt, после чего приложением формируется файл Italy.reg, который надо отредактить:
HKEY_LOCAL_MACHINE\SOFTWARE\Garmin\MapSource\Products\<FileName> заменить на номер кода ProductCode, который задаётся вручную.
"LOC"="C:\\myMaps\\imgs\\", "Tdb"="e:\\maps\\gruzia\\gruzia.tdb" и "BMAP"="C:\\myMaps\\<FileName>.img" меняются на директории в которой лежит конвертируемая карта.

Сделать автоимпорт рег файла в регистр, при этом проверив, что в разделе Products не существует ветки с таким же именем. И.... всё smile

Задача была бы простой, если бы я знал, куда податься  smile Помогите с вопросом, плиз. Это всё нужно для автоматизации конвертирования карт в mapsource.

Заранее спасибо.

P.S. Я уже пробывал написать программу в WinApi, но afxwin.h (в котором есть CEdit) IDE выкидывает с сообщением: "1 C:\Mapsoft\main.cpp In file included from main.cpp" :(

Автор: Alek86 18.3.2008, 11:01
обратись в ветку форумапо WinAPI

Автор: russians 18.3.2008, 11:06
окей

Автор: xvr 18.3.2008, 12:47
Цитата(russians @ 18.3.2008,  11:00)
Добрый день. Поскольку под платформу Win я не разрабатывал ничего и никогда, то прошу участников форума: дайте пример кода, который формирует окно, на нём выставляет поле для ввода и кнопку. 

Мсье мазохист?
Цитата

Задача такая: автоматизировать работу cgpsmapper, ибо заманало каждый раз создавать конфиг smile 
Точно мазохист  smile 
Тебе нужен не WinAPI а какой-нибудь RAD, типа C# c .net или Borland C++ Builder/Delphi или на худой конец Visual Basic
Цитата

P.S. Я уже пробывал написать программу в WinApi, но afxwin.h (в котором есть CEdit) IDE выкидывает с сообщением: "1 C:\Mapsoft\main.cpp In file included from main.cpp" :(
afxwin.h - это не WinAPI а MFC, оно для продвинутых мазохистов  smile 

Автор: ama_kid 18.3.2008, 14:01
Цитата
дайте пример кода, который формирует окно, на нём выставляет поле для ввода и кнопку
ну раз надо - значит надо... лови:
Код
// WindowBasic.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include "WindowBasic.h"
#define MAX_LOADSTRING 100
#define IDB_ACCEPT                 106
#define IDB_EDIT                   107

// Global Variables:
HINSTANCE hInst;                                // current instance
TCHAR szTitle[MAX_LOADSTRING];                    // The title bar text
TCHAR szWindowClass[MAX_LOADSTRING];            // the main window class name
HWND hWnd_Global;
HWND hWnd_Btn;
HWND hWnd_Edit;
WNDPROC wpOrigEditProc;

// Forward declarations of functions included in this code module:
ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT APIENTRY    EditWndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
//LRESULT CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
    // TODO: Place code here.
    MSG msg;
    HACCEL hAccelTable;

    // Initialize global strings
    LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadString(hInstance, IDC_WINDOWBASIC, szWindowClass, MAX_LOADSTRING);
    MyRegisterClass(hInstance);

    // Perform application initialization:
    if (!InitInstance (hInstance, nCmdShow)) 
    {
        return FALSE;
    }

    hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_WINDOWBASIC);

    // Main message loop:
    while (GetMessage(&msg, NULL, 0, 0)) 
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) 
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

    return (int) msg.wParam;
}



//
//  FUNCTION: MyRegisterClass()
//
//  PURPOSE: Registers the window class.
//
//  COMMENTS:
//
//    This function and its usage are only necessary if you want this code
//    to be compatible with Win32 systems prior to the 'RegisterClassEx'
//    function that was added to Windows 95. It is important to call this function
//    so that the application will get 'well formed' small icons associated
//    with it.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEX wcex;

    wcex.cbSize = sizeof(WNDCLASSEX); 

    wcex.style            = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = (WNDPROC)WndProc;
    wcex.cbClsExtra        = 0;
    wcex.cbWndExtra        = 0;
    wcex.hInstance        = hInstance;
    wcex.hIcon            = NULL;//LoadIcon(hInstance, (LPCTSTR)IDI_TRAYICON);
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground    = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName    = NULL;
    wcex.lpszClassName    = szWindowClass;
    wcex.hIconSm        = NULL;//LoadIcon(wcex.hInstance, (LPCTSTR)IDI_TRAYICON);

    return RegisterClassEx(&wcex);
}

//
//   FUNCTION: InitInstance(HANDLE, int)
//
//   PURPOSE: Saves instance handle and creates main window
//
//   COMMENTS:
//
//        In this function, we save the instance handle in a global variable and
//        create and display the main program window.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   hInst = hInstance; // Store instance handle in our global variable
   hWnd_Global = CreateWindow(szWindowClass, szTitle,  WS_OVERLAPPEDWINDOW,
                  100, 100, 200, 120, NULL, NULL, hInstance, NULL);
   hWnd_Btn = CreateWindow("BUTTON",                    // predefined class 
               "ACCEPT",                   // button text 
               WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,    // styles  
               // Size and position values are given explicitly, because 
               // the CW_USEDEFAULT constant gives zero values for buttons. 
               35,45,120,25,                // set size in WM_SIZE message 
               hWnd_Global,                    // parent window 
               NULL,                    // No menu 
               (HINSTANCE) GetWindowLong(hWnd_Global, GWL_HINSTANCE), 
               NULL);                    // pointer not needed 
   SetWindowLong(hWnd_Btn,GWL_ID,IDB_ACCEPT);
   hWnd_Edit = CreateWindow("EDIT",                    // predefined class 
                "Label for Test",                    // no window title 
                WS_CHILD | WS_VISIBLE | WS_BORDER | 
                ES_LEFT, 
                35, 15, 120, 25,                // set size in WM_SIZE message 
                hWnd_Global,                // parent window 
                NULL,                    // edit control ID 
                (HINSTANCE) GetWindowLong(hWnd_Global, GWL_HINSTANCE), 
                NULL);                    // pointer not needed 
   SetWindowLong(hWnd_Edit,GWL_ID,IDB_EDIT);
   wpOrigEditProc = (WNDPROC) SetWindowLong(hWnd_Edit,GWL_WNDPROC, (LONG) EditWndProc);

   if (!hWnd_Global)
   {
      return FALSE;
   }

   ShowWindow(hWnd_Global, nCmdShow);
   UpdateWindow(hWnd_Global);

   return TRUE;
}

//
//  FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
//
//  PURPOSE:  Processes messages for the main window.
//
//  WM_COMMAND    - process the application menu
//  WM_PAINT    - Paint the main window
//  WM_DESTROY    - post a quit message and return
//
//
LRESULT CALLBACK EditWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
    //if ((uMsg == WM_KEYUP) &&(wParam==13)) CheckPassword(); 
    return CallWindowProc(wpOrigEditProc, hwnd, uMsg, wParam, lParam); 
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;

    switch (message) 
    {
    case WM_COMMAND:
        wmId    = LOWORD(wParam); 
        wmEvent = HIWORD(wParam); 
        // Parse the menu selections:
        if ((wmId==IDB_ACCEPT)&&(wmEvent == BN_CLICKED)) 
        {
            char txt[100];
            GetWindowText(hWnd_Edit,txt,100);
            MessageBox(0,txt,"Button Test",0);
        }
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        // TODO: Add any drawing code here...
        EndPaint(hWnd, &ps);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

Автор: russians 18.3.2008, 15:16
ama_kid, ругается на библиотеки smile Из Dev_Cpp вылетает со словами "4 C:\Dev-Cpp\main.cpp In file included from main.cpp"  Откуда код взял?

Автор: ama_kid 18.3.2008, 15:36
Цитата(russians @  18.3.2008,  15:16 Найти цитируемый пост)
Откуда код взял?
сам написал и он работает... какая среда-то у тебя?

Автор: russians 18.3.2008, 15:44
ama_kid, Dev-Cpp, юзает MingW
И WindowBasic.h тоже нету, запиши плиз smile

Автор: ama_kid 18.3.2008, 16:04
Цитата(russians @  18.3.2008,  15:44 Найти цитируемый пост)
Dev-Cpp, юзает MingW
ага, а код - для мелкомягкой студии... К сожалению, Dev-CPP нету, поэтому портировать не смогу...

Автор: ama_kid 18.3.2008, 16:47
закачал себе DevCPP, получай портированный код:
Код
#include <windows.h>

/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

/*  Make the class name into a global variable  */
#define IDS_APP_TITLE               103
#define MAX_LOADSTRING             100
#define IDB_ACCEPT                 106
#define IDB_EDIT                   107
#define IDC_WINDOWBASIC            109

// Global Variables:
HINSTANCE hInst;                                // current instance

char szClassName[ ] = "WindowsApp";
HWND hWnd_Global;
HWND hWnd_Btn;
HWND hWnd_Edit;
WNDPROC wpOrigEditProc;

LRESULT CALLBACK EditWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
    return CallWindowProc(wpOrigEditProc, hwnd, uMsg, wParam, lParam); 
}

int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)

{
    //HWND hwnd;               /* This is the handle for our window */
    MSG messages;            /* Here messages to the application are saved */
    WNDCLASSEX wincl;        /* Data structure for the windowclass */

    /* The Window structure */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
    wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
    wincl.cbSize = sizeof (WNDCLASSEX);

    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;                 /* No menu */
    wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
    wincl.cbWndExtra = 0;                      /* structure or the window instance */
    /* Use Windows's default color as the background of the window */
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&wincl))
        return 0;

    /* The class is registered, let's create the program*/
   hWnd_Global = CreateWindow(szClassName, "Window Basic",  WS_OVERLAPPEDWINDOW,
                  100, 100, 200, 120, NULL, NULL, hThisInstance, NULL);
   hWnd_Btn = CreateWindow("BUTTON",                    // predefined class 
               "ACCEPT",                   // button text 
               WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,    // styles  
               // Size and position values are given explicitly, because 
               // the CW_USEDEFAULT constant gives zero values for buttons. 
               35,45,120,25,                // set size in WM_SIZE message 
               hWnd_Global,                    // parent window 
               NULL,                    // No menu 
               (HINSTANCE) GetWindowLong(hWnd_Global, GWL_HINSTANCE), 
               NULL);                    // pointer not needed 
   SetWindowLong(hWnd_Btn,GWL_ID,IDB_ACCEPT);
   hWnd_Edit = CreateWindow("EDIT",                    // predefined class 
                "Label for Test",                    // no window title 
                WS_CHILD | WS_VISIBLE | WS_BORDER | 
                ES_LEFT, 
                35, 15, 120, 25,                // set size in WM_SIZE message 
                hWnd_Global,                // parent window 
                NULL,                    // edit control ID 
                (HINSTANCE) GetWindowLong(hWnd_Global, GWL_HINSTANCE), 
                NULL);                    // pointer not needed 
   SetWindowLong(hWnd_Edit,GWL_ID,IDB_EDIT);
   wpOrigEditProc = (WNDPROC) SetWindowLong(hWnd_Edit,GWL_WNDPROC, (LONG) EditWndProc);
   
    /* Make the window visible on the screen */
    ShowWindow (hWnd_Global, nFunsterStil);

    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage (&messages, NULL, 0, 0))
    {
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&messages);
        /* Send message to WindowProcedure */
        DispatchMessage(&messages);
    }

    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
}


/*  This function is called by the Windows function DispatchMessage()  */

LRESULT CALLBACK WindowProcedure (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
    switch (message) 
    {
    case WM_COMMAND:
        wmId    = LOWORD(wParam); 
        wmEvent = HIWORD(wParam); 
        // Parse the menu selections:
        if ((wmId==IDB_ACCEPT)&&(wmEvent == BN_CLICKED)) 
        {
            char txt[100];
            GetWindowText(hWnd_Edit,txt,100);
            MessageBox(0,txt,"Button Test",0);
        }
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        // TODO: Add any drawing code here...
        EndPaint(hWnd, &ps);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

Автор: russians 19.3.2008, 14:12
Код

#include <windows.h>
#include <iostream.h>
#include <fstream.h>
#include <string.h>
using namespace std;

/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

/*  Make the class name into a global variable  */
#define IDS_APP_TITLE               103
#define MAX_LOADSTRING             100
#define IDB_ACCEPT                 106
#define IDB_EDIT                   107
#define IDC_WINDOWBASIC            109

// Global Variables:
HINSTANCE hInst;                                // current instance

char szClassName[ ] = "WindowsApp";
HWND hWnd_Global;
HWND hWnd_Btn;
HWND hWnd_Edit;
HWND hWnd_Edit1;
HWND hWnd_Edit2;
HWND hWnd_Label;
HWND hWnd_Label1;
HWND hWnd_Label2;
WNDPROC wpOrigEditProc;

LRESULT CALLBACK EditWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
    return CallWindowProc(wpOrigEditProc, hwnd, uMsg, wParam, lParam); 
}

int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)

{
    //HWND hwnd;               /* This is the handle for our window */
    MSG messages;            /* Here messages to the application are saved */
    WNDCLASSEX wincl;        /* Data structure for the windowclass */

    /* The Window structure */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
    wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
    wincl.cbSize = sizeof (WNDCLASSEX);

    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;                 /* No menu */
    wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
    wincl.cbWndExtra = 0;                      /* structure or the window instance */
    /* Use Windows's default color as the background of the window */
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&wincl))
        return 0;

    /* The class is registered, let's create the program*/
   hWnd_Global = CreateWindow(szClassName, "cgpsmapper AUTOMAKE",  WS_OVERLAPPEDWINDOW,
                  0, 0, 800, 600, NULL, NULL, hThisInstance, NULL);
   hWnd_Btn = CreateWindow("BUTTON",                    // predefined class 
               "ACCEPT",                   // button text 
               WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,    // styles  
               // Size and position values are given explicitly, because 
               // the CW_USEDEFAULT constant gives zero values for buttons. 
               100,150,120,25,                // set size in WM_SIZE message 
               hWnd_Global,                    // parent window 
               NULL,                    // No menu 
               (HINSTANCE) GetWindowLong(hWnd_Global, GWL_HINSTANCE), 
               NULL);                    // pointer not needed 
   SetWindowLong(hWnd_Btn,GWL_ID,IDB_ACCEPT);
   hWnd_Edit = CreateWindow("EDIT",                    // predefined class 
                "GlobalMapDefault",                    // no window title 
                WS_CHILD | WS_VISIBLE | WS_BORDER | 
                ES_LEFT, 
                150, 15, 250, 25,                // set size in WM_SIZE message 
                hWnd_Global,                // parent window 
                NULL,                    // edit control ID 
                (HINSTANCE) GetWindowLong(hWnd_Global, GWL_HINSTANCE), 
                NULL);                    // pointer not needed
   
   hWnd_Label = CreateWindow("STATIC",                    // predefined class 
                "Íàçâàíèå êàðòû",                    // no window title 
                WS_CHILD | WS_VISIBLE |  
                ES_LEFT, 
                10, 15, 120, 25,                // set size in WM_SIZE message 
                hWnd_Global,                // parent window 
                NULL,                    // edit control ID 
                (HINSTANCE) GetWindowLong(hWnd_Global, GWL_HINSTANCE), 
                NULL);                    // pointer not needed
                
   hWnd_Edit1 = CreateWindow("EDIT",                    // predefined class 
                "0",                    // no window title 
                WS_CHILD | WS_VISIBLE | WS_BORDER | 
                ES_LEFT, 
                150, 55, 250, 25,                // set size in WM_SIZE message 
                hWnd_Global,                // parent window 
                NULL,                    // edit control ID 
                (HINSTANCE) GetWindowLong(hWnd_Global, GWL_HINSTANCE), 
                NULL);                    // pointer not needed
   
   hWnd_Label1 = CreateWindow("STATIC",                    // predefined class 
                "Product Code",                    // no window title 
                WS_CHILD | WS_VISIBLE |  
                ES_LEFT, 
                15, 55, 120, 25,                // set size in WM_SIZE message 
                hWnd_Global,                // parent window 
                NULL,                    // edit control ID 
                (HINSTANCE) GetWindowLong(hWnd_Global, GWL_HINSTANCE), 
                NULL);                    // pointer not needed
                
   hWnd_Edit2 = CreateWindow("EDIT",                    // predefined class 
                "C:\\Mapsoft\\Default.img",                    // no window title 
                WS_CHILD | WS_VISIBLE | WS_BORDER | 
                ES_LEFT, 
                150, 95, 250, 25,                // set size in WM_SIZE message 
                hWnd_Global,                // parent window 
                NULL,                    // edit control ID 
                (HINSTANCE) GetWindowLong(hWnd_Global, GWL_HINSTANCE), 
                NULL);                    // pointer not needed
   
   hWnd_Label2 = CreateWindow("STATIC",                    // predefined class 
                "File Name",                    // no window title 
                WS_CHILD | WS_VISIBLE |  
                ES_LEFT, 
                15, 95, 120, 25,                // set size in WM_SIZE message 
                hWnd_Global,                // parent window 
                NULL,                    // edit control ID 
                (HINSTANCE) GetWindowLong(hWnd_Global, GWL_HINSTANCE), 
                NULL);                    // pointer not needed
   
                
                               
   SetWindowLong(hWnd_Edit,GWL_ID,IDB_EDIT);
   wpOrigEditProc = (WNDPROC) SetWindowLong(hWnd_Edit,GWL_WNDPROC, (LONG) EditWndProc);
   
    /* Make the window visible on the screen */
    ShowWindow (hWnd_Global, nFunsterStil);

    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage (&messages, NULL, 0, 0))
    {
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&messages);
        /* Send message to WindowProcedure */
        DispatchMessage(&messages);
    }

    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
}


/*  This function is called by the Windows function DispatchMessage()  */

LRESULT CALLBACK WindowProcedure (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
    switch (message) 
    {
    case WM_COMMAND:
        wmId    = LOWORD(wParam); 
        wmEvent = HIWORD(wParam); 
        // Parse the menu selections:
        if ((wmId==IDB_ACCEPT)&&(wmEvent == BN_CLICKED)) 
        {
            char CardName[250];
            char ProductCode[250];
            char FileName[250];
            char OutputFile[3000];
            GetWindowText(hWnd_Edit,CardName,250);
            GetWindowText(hWnd_Edit1,ProductCode,250);
            GetWindowText(hWnd_Edit2,FileName,250);
            OutputFile = "[Map]\n"+"FileName="+CardName+"\n"+"MapVersion=100\n"+
            "ProductCode="+ProductCode+"\n"+"Levels=2\n"+"Level0=15\n"+"Level1=13\n"+
            "Zoom0=7\n"+"Zoom1=8\n"+"MapsourceName="+CardName+"\n"+"MapSetName="+CardName+"\n"+
            "CDSetName="+CardName+"\n"+"Copy1=Garmin\n"+"Copy2=Garmin\n"+"[End-Map]\n\n"+
            "[Files]\n"+"img="+FileName+"\n"+"[END-Files]";
            FILE * fo;
            fo = fopen("pv.txt","wt");
            while( !feof(fo) ) 
            {
                   fprintf( fo, "%d\n", OutputFile );
            }
            
        }
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        // TODO: Add any drawing code here...
        EndPaint(hWnd, &ps);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;

}



Выдаёт следующее:

2 C:\Dev-Cpp\include\c++\3.4.2\backward\fstream.h:31,               from main.cpp In file included from C:/Dev-Cpp/include/c++/3.4.2/backward/fstream.h:31,               from main.cpp 
32:2 C:\Dev-Cpp\include\c++\3.4.2\backward\backward_warning.h #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <iostream> instead of the deprecated header <iostream.h>. To disable this warning use -Wno-deprecated. 
 C:\Dev-Cpp\main.cpp In function `LRESULT WindowProcedure(HWND__*, UINT, WPARAM, LPARAM)': 

184 C:\Dev-Cpp\main.cpp invalid operands of types `const char[7]' and `const char[10]' to binary `operator+' 
 C:\Dev-Cpp\Makefile.win [Build Error]  [main.o] Error 1 

По поводу строк: оператор + в строках не используется?

Автор: ama_kid 19.3.2008, 17:25
russians, во-первых, если тебе iostream.h и fstream.h нужны только для FILE, то лучше использовать stdio.h - не будет левых варнингов...
Во вторых, как тебе такой код?
Код

    case WM_COMMAND:
        wmId    = LOWORD(wParam); 
        wmEvent = HIWORD(wParam); 
        // Parse the menu selections:
        if ((wmId==IDB_ACCEPT)&&(wmEvent == BN_CLICKED)) 
        {
            char CardName[250];
            char ProductCode[250];
            char FileName[250];
            char OutputFile[3000]="";
            GetWindowText(hWnd_Edit,CardName,250);
            GetWindowText(hWnd_Edit1,ProductCode,250);
            GetWindowText(hWnd_Edit2,FileName,250);
            strcpy(OutputFile,"[Map]\nFileName=");
            strcat(OutputFile,CardName);
            strcat(OutputFile,"\nMapVersion=100\nProductCode=");
            strcat(OutputFile,ProductCode);
            strcat(OutputFile,"\nLevels=2\nLevel0=15\nLevel1=13\nZoom0=7\nZoom1=8\nMapsourceName=");
            strcat(OutputFile,CardName);
            strcat(OutputFile,"\nMapSetName=");
            strcat(OutputFile,CardName);
            strcat(OutputFile,"\nCDSetName=");
            strcat(OutputFile,CardName);
            strcat(OutputFile,"\nCopy1=Garmin\nCopy2=Garmin\n[End-Map]\n\n[Files]\nimg=");
            strcat(OutputFile,FileName);
            strcat(OutputFile,"\n[END-Files]");
            FILE * fo;
            fo = fopen("pv.txt","wt");
            fprintf( fo, "%s\n", OutputFile );
            fclose(fo);           
        }

Цитата(russians @  19.3.2008,  14:12 Найти цитируемый пост)
оператор + в строках не используется? 
используй операцию конкатенации...

Автор: russians 20.3.2008, 09:34
ama_kid, strcpy я подумывал использовать, НО это гемор с написанием... конвертнуть в string сложить а потом в char никак?
И ещё, какие существуют способы выполнения внешнего файла из командной строки с параметром?
Без CreateProcess никак?

Автор: ama_kid 20.3.2008, 10:23
Цитата(russians @  20.3.2008,  09:34 Найти цитируемый пост)
конвертнуть в string сложить а потом в char никак?
Код
#include <cstdlib>
#include <iostream>

using namespace std;

class String
{
private:
   char string[1024];
public:
   String();
   String(char*);
   friend String operator+(String,String);
   friend ostream& operator<< (ostream&,String&);
   char * GetString();
};
String::String()
{
   string[0]='\0';
}
String::String(char*str)
{
   int index = 0;
   while(str[index]!='\0')
      string[index] = str[index++];
   string[index]='\0';
}
String operator+(String S1,String S2)
{
   String res_string;
   int index = 0,index2 = 0;
   while(S1.string[index]!='\0')
      res_string.string[index] = S1.string[index++];
   while(S2.string[index2]!='\0')
      res_string.string[index++] = S2.string[index2++];
   res_string.string[index]='\0';
   return res_string;
}
ostream& operator<< (ostream& out,String& str)
{
      out<<str.string<<endl;
      return out;
}

char * String::GetString()
{
 return &string[0];
}

int main(int argc, char *argv[])
{
   String S1, S2("abc"), S3("12234");
   S1 = S2+S3;
   cout<<S1.GetString();
   cin.get();
   return EXIT_SUCCESS;
}

Цитата
И ещё, какие существуют способы выполнения внешнего файла из командной строки с параметром?Без CreateProcess никак?
А чем тебя CreateProcess не устраивает? Можно конечно WinExec юзать, но имхо лучше CreateProcess...

Автор: russians 20.3.2008, 11:04
Так, базовая задача решена, осталось дело за малым, есть Reg файл, сгенерированный программой:

REGEDIT4

[HKEY_LOCAL_MACHINE\SOFTWARE\Garmin\MapSource\Products\GlobalMapDefault]
"LOC"="C:\\myMaps\\imgs\\"
"BMAP"="C:\\myMaps\\GlobalMapDefault.img"
"TDB"="C:\\myMaps\\GlobalMapDefault.tdb"

Нужно определить позиции вхождения и позаменять GlobalMapDefault на ProductCode и myMaps на имя локальной папки...
Как определить локальную папку нахождения программы?  smile 

Автор: ama_kid 20.3.2008, 11:22
Цитата(russians @  20.3.2008,  11:04 Найти цитируемый пост)
Как определить локальную папку нахождения программы?
С помощью http://msdn2.microsoft.com/en-us/library/ms683197.aspx. К примеру так: 
Код

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


Автор: russians 21.3.2008, 10:09
И последнее, я видел стандартный алгоритм замены подстроки в строке для С++, но сейчас никак найти не могу, только для 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;
}

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

Автор: russians 21.3.2008, 11:04
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 идёт дальше по алгоритму :(

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

Автор: russians 21.3.2008, 12:35
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 );

Автор: ama_kid 21.3.2008, 13:08
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;
    }
}
Не нашел у в себя функции для записи в реестр строк - она делается аналогично записи слова, смотри http://msdn2.microsoft.com/en-us/library/ms724923.aspx - там есть http://msdn2.microsoft.com/en-us/library/aa363634(VS.85).aspx...

Автор: russians 21.3.2008, 14:08
ama_kid, дык, код немаленький smile Хочеца одын функция для запросов smile

Автор: ama_kid 21.3.2008, 15:29
Цитата(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);


Автор: russians 21.3.2008, 15:58
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' 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)