Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/78: Рейтинг темы: голосов - 78, средняя оценка - 4.67
2 / 2 / 1
Регистрация: 24.03.2010
Сообщений: 121

Ассоциация расширения файлов с программой

16.04.2011, 11:25. Показов 16753. Ответов 36
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Visual Studio 2008, проект MFC dialog-based.
Подскажите, как ассоциировать расширение файла (например, .xyz) со своей программой, чтобы по двойному клику на файле он открывался в программе. Если попытаться через "Открыть с помощью", то программа просто запускается, а открытия файла не происходит.
Нашел несколько ссылок, но там толком не объясняется.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.04.2011, 11:25
Ответы с готовыми решениями:

Ассоциация расширения файлов с программой
Добрый вечер.В данный момент времени я занимаюсь разработкой приложения , и мне потребовалось привязать расширение для своей...

Ассоциация файлов с программой
Всем доброго времени суток. Я в программировании недавно. Помогите пожалуйсто сделать ассоциацию mp3 файлов с моей программой, или...

Ассоциация файлов с программой
Здравствуйте, в delphi возможно реализовать ассоциацию файлов с программой. Это было реализовано, но появилась проблема. Как получить путь...

36
 Аватар для мистер х
21 / 21 / 2
Регистрация: 11.01.2009
Сообщений: 110
16.04.2011, 19:44
1)
All extensions, file types and classes are stored in the Windows registry beneath the registry key HKEY_CLASSES_ROOT. The file type for files having extension .txt is stored in the registry key HKEY_CLASSES_ROOT\.txt and its associated file type, mostly txtfile, can be found in the key HKEY_CLASSES_ROOT\txtfile. Classes can be found beneath the key HKEY_CLASSES_ROOT\CLSID key and the applications beneath HKEY_CLASSES_ROOT\Applications. These settings are valid for the whole workstation.
как я понимаю нужно работать с реестром
2) когда программа будет открываться ей в параметры передадутся пути к файлу(лам)
1
2 / 2 / 1
Регистрация: 24.03.2010
Сообщений: 121
17.04.2011, 09:21  [ТС]
мистер х, спасибо, к сожалению только в понедельник смогу попробовать покопаться
0
2 / 2 / 1
Регистрация: 24.03.2010
Сообщений: 121
18.04.2011, 19:25  [ТС]
Не получилось. Пробовал по примеру ниже:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
//ассоциация расширения файла с приложением
bool ExtentionAssociation(bool bCreate1_or_delete0,const char* pEXT,const char* pAppDocumentName,const char* pModulePath)
{
    if(!pEXT || !*pEXT)return false;
    if(!pAppDocumentName || !*pAppDocumentName)return false;
    if(!pModulePath || !*pModulePath)return false;
 
    //первый ключ
    //HKEY_CLASSES_ROOT\\.ext\\
    //установить значение строки "default" данного ключа в "internal name" для типа файла - например
    //HKEY_CLASSES_ROOT\\.ext\\ Default = "MyApp.Document"
 
    //второй ключ
    //HKEY_CLASSES_ROOT\\MyApp.Document\\
 
    //Создайть подключ ....\\command.
    //Значение default в ключе command - это расположение и имя приложения,
    //заканчивающегося на "%1", которое представляет параметр, в котором приложению
    //будет передаваться имя файла данных:
 
    //HKEY_CLASSES_ROOT\\MyApp.Document\\shell\\open\\command\\ Default = "C:\\myapp\\myapp.exe %1"
 
 
    HKEY k=0;
    DWORD dwdRes=0;
 
    std::string sEXT=".";
    sEXT+=pEXT;
 
    std::string sRanParam=pAppDocumentName;
    sRanParam+="\\shell\\open\\command";
 
    std::string sRanValue=pModulePath;
    sRanValue+=" %1";
 
    if(bCreate1_or_delete0)
    {
        //первый ключ
        //HKEY_CLASSES_ROOT\\.ext\\default = "pAppDocumentName"
        dwdRes=RegCreateKeyEx(HKEY_CLASSES_ROOT,sEXT.c_str(),0,0,0,KEY_ALL_ACCESS,0,&k,0);
        if(dwdRes==ERROR_SUCCESS)
        {
            RegSetValueEx(k,/*"default"*/0,0,REG_SZ,(BYTE*)pAppDocumentName,strlen(pAppDocumentName));
            RegCloseKey(k);k=0;
        }
 
        //второй ключ
        //HKEY_CLASSES_ROOT\\"pAppDocumentName"\\shell\\open\\command\\default = "pModulePath"+" %1"
        dwdRes=RegCreateKeyEx(HKEY_CLASSES_ROOT,sRanParam.c_str(),0,0,0,KEY_ALL_ACCESS,0,&k,0);
        if(dwdRes==ERROR_SUCCESS)
        {
            RegSetValueEx(k,/*"default"*/0,0,REG_SZ,(BYTE*)sRanValue.c_str(),sRanValue.size());
            RegCloseKey(k);k=0;
        }
    }
    else
    {
        //первый ключ
        //HKEY_CLASSES_ROOT\\.ext\\default = "pAppDocumentName"
        dwdRes=RegOpenKeyEx(HKEY_CLASSES_ROOT,sEXT.c_str(),0,KEY_ALL_ACCESS,&k);
        if(dwdRes==ERROR_SUCCESS)
        {
            SHDeleteKey(k,0);//RegDeleteTree(k,0);
            RegCloseKey(k);k=0;
        }
 
        //второй ключ
        //HKEY_CLASSES_ROOT\\"pAppDocumentName"\\shell\\open\\command\\default = "pModulePath"+" %1"
        dwdRes=RegOpenKeyEx(HKEY_CLASSES_ROOT,sRanParam.c_str(),0,KEY_ALL_ACCESS,&k);
        if(dwdRes==ERROR_SUCCESS)
        {
            SHDeleteKey(k,0);//RegDeleteTree(k,0);
            RegCloseKey(k);k=0;
        }
    }
 
    return true;
}
Прописал следующее (нужно ассоциировать расширение .grf с программой Grafik.exe):
HKEY_CLASSES_ROOT\.grf\ Default = "Grafik.exe" (вместо "Grafik.exe" было "grf_auto_file")
Был ключ HKEY_CLASSES_ROOT\grf_auto_file... Переименовал в HKEY_CLASSES_ROOT\Grafik.exe...
HKEY_CLASSES_ROOT\Grafik.exe\shell\open\ command\ Default = "C:\Program Files\Grafik\Grafik.exe %1"
Теперь при попытке "Открыть с помощью..." моей программы даже нет в списке, хоть и указываю путь к ней)
Удалил эти ключи из реестра, переустановил прогу, все вернулось в изначальное состояние, т.е. запускается программа, но не открывается файл.
0
 Аватар для мистер х
21 / 21 / 2
Регистрация: 11.01.2009
Сообщений: 110
18.04.2011, 22:57
а компьютер перезагружал ? ))))))))))))))))))))))

а ты не пробовал все это самостоятельно делать может программа как-то криво все это делает?
еще
на примере Picasa увидел что в папке DefaultIcon тот же файл только с параметром 102....
0
2 / 2 / 1
Регистрация: 24.03.2010
Сообщений: 121
19.04.2011, 18:41  [ТС]
Цитата Сообщение от мистер х Посмотреть сообщение
а компьютер перезагружал ? ))))))))))))))))))))))
может я и ошибаюсь, но по-моему после таких изменений в реестре комп не надо перезагружать) После установки офиса ведь не требуется этого делать. А там тоже ассоциируются расширения. А вообще перезагружал - не помогло)

Цитата Сообщение от мистер х Посмотреть сообщение
а ты не пробовал все это самостоятельно делать может программа как-то криво все это делает?
как раз вручную в реестре все менял, в коде только ключи посмотрел

Цитата Сообщение от мистер х Посмотреть сообщение
на примере Picasa увидел что в папке DefaultIcon тот же файл только с параметром 102....
где это посмотреть?
0
 Аватар для мистер х
21 / 21 / 2
Регистрация: 11.01.2009
Сообщений: 110
20.04.2011, 23:20
я в своем реестре смотрел, расширение jpg
насчет перезагрузки : как я понимаю все изменения только после перезагрузки вступают в силу

вот смотри кое-что нашел
http://www.ubercode.com/write-... s-api.html
3. How do I create file associations?
1
2 / 2 / 1
Регистрация: 24.03.2010
Сообщений: 121
21.04.2011, 18:45  [ТС]
мистер х, спасибо, поразбираюсь, завтра отпишусь

нашел еще кое-что: http://phi.lho.free.fr/windows... ns.en.html
похоже надо на англ. языке искать, там инфы больше
0
2 / 2 / 1
Регистрация: 24.03.2010
Сообщений: 121
22.04.2011, 22:19  [ТС]
ничего не получилось...
0
0 / 0 / 0
Регистрация: 15.07.2011
Сообщений: 15
15.07.2011, 22:26
А ParamStr(1); юзать в коде программы не пробовал? Если открываешь 1 файл, то тут адрес к нему хранит программа.
Отсюда уже прога может обработать что надо. Один момент -- на C++ при использовании ParamStr(k) надо прописывать ParamStr(k).c_str(), т.к. многие процедуры просят не строку, а ссылку на нее.

Добавлено через 11 минут
Например:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
//---------------------------------------------------------------------------
 
#include <vcl.h>
#include <iostream>
#include <fstream.h>
#include <shellapi.h>
#include <windows.h>
#include <winbase.h>
#pragma hdrstop
 
//---------------------------------------------------------------------------
 
#pragma argsused
int main(int argc, char* argv[])
{
        if((ParamCount()!=0) && (ExtractFileDrive(ParamStr(1))!=ExtractFileDrive(ParamStr(0)))) {
          if(ParamStr(1)!=""){cout << "Param_1 exists." << '\n';};
          // int shluck;
          // cin >> shluck;
          String param=ExtractFilePath(ParamStr(0))+"kmap_config.mcl";
          ifstream in(param.c_str());
          AnsiString ads=ExtractFilePath(ParamStr(0))+"\\";
          char buf;
          AnsiString par2="";
          cout << "Start";
          if (in.fail()) {par2=ExtractFileDrive(ParamStr(0))+"\\Temp_File.AHP"; cout << /*"C:\\Temp_File.AHP" <<*/ '\n';} else {
                in >> buf;
                while (!in.eof()){
                        ads+=buf;
                        cout << buf;
                        in >> buf;
                }
                in.close();
                par2=ads;
          }
          const AnsiString par1=ParamStr(1);
          const AnsiString parT=ExtractFileExt(par1.c_str());
          system("cls");
          char str3[] = "Îïåðàöèÿ êîïèðîâàíèÿ ìîæåò çàíÿòü îò 1 ñåêóíäû äî 5 ìèíóò â çàâèñèìîñòè îò ðàçìåðà ôàéëà.";
          char buf3[512];
 
          CharToOem(str3, buf3);
 
          cout << buf3 <<'\n';
          Sleep(3000);
          ShowWindow(GetConsoleWindow(), SW_MINIMIZE);
          CopyFile(par1.c_str(),par2.c_str(), false);
          ShowWindow(GetConsoleWindow(), SW_MINIMIZE);
          // ShellExecute( NULL, "open", par2.c_str(), NULL, NULL, SW_SHOW );
                                SHELLEXECUTEINFO si;
                                memset(&si, 0, sizeof(si));
                                si.cbSize = sizeof(si);
                                si.hwnd = NULL;
                                si.lpVerb = "open";
                                si.lpFile = par2.c_str();
                                si.nShow = SW_SHOW;
                                si.fMask = SEE_MASK_NOCLOSEPROCESS;  // SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_DDEWAIT
                                bool res =  ShellExecuteEx (&si);
 
                                if (res) {WaitForSingleObject(si.hProcess, INFINITE );}
 
 
                                ShowWindow(GetConsoleWindow(), SW_SHOW);
                                system("cls");
 
                                char str10[]="Âîñïðîèçâåäåíèå îêîí÷åíî. Áóôåðíûé ôàéë áóäåò óäàë¸í.";
                                char buf10[512];
                                CharToOem(str10,buf10);
                                cout << buf10 << '\n';
                                Sleep(4000);
                                remove(par2.c_str());
        } else {
                if(ParamCount()!=1){
 
                                char str4[]="Íåò ïàðàìåòðîâ... Îøèáêà...";
                                char buf4[128];
 
                                CharToOem(str4,buf4);
                                system("cls");
                                cout << '\a' << buf4 << '\a' << '\n';
                                char ttt;
                                cin >> ttt;
                        } else {
 
                                ShowWindow(GetConsoleWindow(), SW_MINIMIZE);
                                const AnsiString par1=ParamStr(1);
                                String param=ExtractFilePath(ParamStr(0))+"kmap_config.mcl";
                                 ifstream in(param.c_str());
                                   AnsiString ads=ExtractFilePath(ParamStr(0))+"\\";
                                    char buf;
                                    AnsiString par2="";
                                    cout << "Start";
                                     if (in.fail()) {par2=ExtractFileDrive(ParamStr(0))+"\\Temp_File.AHP"; cout << '\n' << /*"C:\\Temp_File.MVOA" <<*/ '\n';} else {
                                         in >> buf;
                                         while (!in.eof()){
                                         ShowWindow(GetConsoleWindow(), SW_MINIMIZE);
                                                ads+=buf;
                                                 cout << buf;
                                                  in >> buf;
                                          }
                                         in.close();
                                         par2=ads;
                                           }
                                           ShowWindow(GetConsoleWindow(), SW_MINIMIZE);
                                AnsiString par3=ExtractFileDir(ParamStr(1))+"\\"+ExtractFileName(ParamStr(1))+ExtractFileExt(par2);
                                rename(ParamStr(1).c_str(),par3.c_str());
 
                                // Sleep(200);
                                        ShowWindow(GetConsoleWindow(), SW_MINIMIZE);
                                // Sleep(200);
                                SHELLEXECUTEINFO si;
                                memset(&si, 0, sizeof(si));
                                si.cbSize = sizeof(si);
                                si.hwnd = NULL;
                                si.lpVerb = "open";
                                si.lpFile = par3.c_str();
                                si.nShow = SW_SHOW;
                                si.fMask = SEE_MASK_NOCLOSEPROCESS;  // SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_DDEWAIT
                                bool res =  ShellExecuteEx (&si);
                                           ShowWindow(GetConsoleWindow(), SW_MINIMIZE);
                                // CopyFile(par3.c_str(), par1.c_str(), false);
                                           ShowWindow(GetConsoleWindow(), SW_MINIMIZE);
                                if (res) {WaitForSingleObject(si.hProcess, INFINITE );}
                                CloseHandle(si.hProcess);
                                ShowWindow(GetConsoleWindow(), SW_MINIMIZE);
                                rename(par3.c_str(), ParamStr(1).c_str());
                                // remove(par3.c_str());
                        }
        };
}
//---------------------------------------------------------------------------
Тут у меня буферная программа между медиафайлом и плеером. Надеюсь, разберёшься, как ParamStr(k) использовать.
0
2 / 2 / 1
Регистрация: 24.03.2010
Сообщений: 121
16.07.2011, 09:39  [ТС]
Dr.Savinkov, спасибо, попробую
0
0 / 0 / 0
Регистрация: 15.07.2011
Сообщений: 15
17.07.2011, 01:27
UFO665, один момент! извиняюсь, если выдам ненужную или известную тебе информацию, но!
1) ParamStr(k) лишь передаёт в программу адрес открываемого файла в формате "FileDrive:/FileFolder/FileName.FileExt";
2) первый пункт на реестр НИКАК не влияет. Он лишь позволяет открыть уже ассоциированные файлы с помощью, например, "Открыть как". Как регать в реестре--сам пока разбираюсь. А твой вариант регистрации работает?

Добавлено через 1 час 6 минут
Ах да, кажись для того, чтобы изменения в Реестре(!!!) вступили в силу, надо перезапустить процесс explorer. Выключить и вновь запустить. Как выключить не помню. Лежит его exe-шник кажись в "C:/WINDOWS/system32/". Думаю, для запуска будет достаточно
C++
1
WinExec(ExtractFileDrive(ParamStr(0))+"/WINDOWS/system32/explorer.exe").c_str());
Так... В ParamStr(0) хранится адрес вызванного exe-шника(для справки).

Добавлено через 46 минут
Цитата Сообщение от UFO665 Посмотреть сообщение
Не получилось. Пробовал по примеру ниже:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
//ассоциация расширения файла с приложением
bool ExtentionAssociation(bool bCreate1_or_delete0,const char* pEXT,const char* pAppDocumentName,const char* pModulePath)
{
    if(!pEXT || !*pEXT)return false;
    if(!pAppDocumentName || !*pAppDocumentName)return false;
    if(!pModulePath || !*pModulePath)return false;
 
    //первый ключ
    //HKEY_CLASSES_ROOT\\.ext\\
    //установить значение строки "default" данного ключа в "internal name" для типа файла - например
    //HKEY_CLASSES_ROOT\\.ext\\ Default = "MyApp.Document"
 
    //второй ключ
    //HKEY_CLASSES_ROOT\\MyApp.Document\\
 
    //Создайть подключ ....\\command.
    //Значение default в ключе command - это расположение и имя приложения,
    //заканчивающегося на "%1", которое представляет параметр, в котором приложению
    //будет передаваться имя файла данных:
 
    //HKEY_CLASSES_ROOT\\MyApp.Document\\shell\\open\\command\\ Default = "C:\\myapp\\myapp.exe %1"
 
 
    HKEY k=0;
    DWORD dwdRes=0;
 
    std::string sEXT=".";
    sEXT+=pEXT;
 
    std::string sRanParam=pAppDocumentName;
    sRanParam+="\\shell\\open\\command";
 
    std::string sRanValue=pModulePath;
    sRanValue+=" %1";
 
    if(bCreate1_or_delete0)
    {
        //первый ключ
        //HKEY_CLASSES_ROOT\\.ext\\default = "pAppDocumentName"
        dwdRes=RegCreateKeyEx(HKEY_CLASSES_ROOT,sEXT.c_str(),0,0,0,KEY_ALL_ACCESS,0,&k,0);
        if(dwdRes==ERROR_SUCCESS)
        {
            RegSetValueEx(k,/*"default"*/0,0,REG_SZ,(BYTE*)pAppDocumentName,strlen(pAppDocumentName));
            RegCloseKey(k);k=0;
        }
 
        //второй ключ
        //HKEY_CLASSES_ROOT\\"pAppDocumentName"\\shell\\open\\command\\default = "pModulePath"+" %1"
        dwdRes=RegCreateKeyEx(HKEY_CLASSES_ROOT,sRanParam.c_str(),0,0,0,KEY_ALL_ACCESS,0,&k,0);
        if(dwdRes==ERROR_SUCCESS)
        {
            RegSetValueEx(k,/*"default"*/0,0,REG_SZ,(BYTE*)sRanValue.c_str(),sRanValue.size());
            RegCloseKey(k);k=0;
        }
    }
    else
    {
        //первый ключ
        //HKEY_CLASSES_ROOT\\.ext\\default = "pAppDocumentName"
        dwdRes=RegOpenKeyEx(HKEY_CLASSES_ROOT,sEXT.c_str(),0,KEY_ALL_ACCESS,&k);
        if(dwdRes==ERROR_SUCCESS)
        {
            SHDeleteKey(k,0);//RegDeleteTree(k,0);
            RegCloseKey(k);k=0;
        }
 
        //второй ключ
        //HKEY_CLASSES_ROOT\\"pAppDocumentName"\\shell\\open\\command\\default = "pModulePath"+" %1"
        dwdRes=RegOpenKeyEx(HKEY_CLASSES_ROOT,sRanParam.c_str(),0,KEY_ALL_ACCESS,&k);
        if(dwdRes==ERROR_SUCCESS)
        {
            SHDeleteKey(k,0);//RegDeleteTree(k,0);
            RegCloseKey(k);k=0;
        }
    }
 
    return true;
}
Прописал следующее (нужно ассоциировать расширение .grf с программой Grafik.exe):
HKEY_CLASSES_ROOT\.grf\ Default = "Grafik.exe" (вместо "Grafik.exe" было "grf_auto_file")
Был ключ HKEY_CLASSES_ROOT\grf_auto_file... Переименовал в HKEY_CLASSES_ROOT\Grafik.exe...
HKEY_CLASSES_ROOT\Grafik.exe\shell\open\ command\ Default = "C:\Program Files\Grafik\Grafik.exe %1"
Теперь при попытке "Открыть с помощью..." моей программы даже нет в списке, хоть и указываю путь к ней)
Удалил эти ключи из реестра, переустановил прогу, все вернулось в изначальное состояние, т.е. запускается программа, но не открывается файл.
Скажи, ты это тут взял?
0
2 / 2 / 1
Регистрация: 24.03.2010
Сообщений: 121
17.07.2011, 10:57  [ТС]
Цитата Сообщение от Dr.Savinkov Посмотреть сообщение
А твой вариант регистрации работает?
Нет, программа просто запускается, но файл в ней не открывается, хотя его расширение ассоциировано с программой.
Цитата Сообщение от Dr.Savinkov Посмотреть сообщение
Скажи, ты это тут взял?
Уже не вспомню) Возможно тут.

К сожалению, смогу попробовать разобраться только в начале августа, сейчас в отпуске. Спасибо за помощь)
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
17.07.2011, 18:32
Я бы не заморачивался, и воспользовался стандартным диалогом прописи файла который заложен в винде. Для ХП его вид приведен на 1-й миниатюре. После того как расширение будет зарегетрировано, сохранить из реестра в reg-файл ветвь с нужным расширением, и забить в прогу при её первом записи простое копирование в реестр готовых ключей из reg-файла.
Миниатюры
Ассоциация расширения файлов с программой   Ассоциация расширения файлов с программой  
1
0 / 0 / 0
Регистрация: 15.07.2011
Сообщений: 15
17.07.2011, 19:06
UFO665, ты неправильно понял мой вопрос. У тебя прога реестр правильно изменяла? ты проверял?
-=ЮрА=-, можно поподробнее? в принципе, у меня Вин 7, но может пригодится твой метод. Но ты не понял суть вопроса. Файл ассоциирован(насколько я понял). Соль в том, что у приложения нет "зацепки"--адреса открываемого файла. А мы даём такую зацепку из ParamStr(1).
ParamStr(0)-адрес собственно работающего приложения;
ParamStr(1)-параметр №1; // в данном случае адрес открываемого файла;
.
.
.
ParamStr(n)-параметр №n;
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
17.07.2011, 19:56
Как ты проверял что файл ассоциирован, реестр открывал???
Файл асоциирован если есть запись .xyz в втеви HKEY_CLASSES_ROOT, если есть возможность экспортируй в reg-файл содержимое ветви .xyz и выложи сюда, попробую проверить

Ну и не совсем понял, программа, что должна запускаться из командной строки???
0
0 / 0 / 0
Регистрация: 15.07.2011
Сообщений: 15
17.07.2011, 20:24
-=ЮрА=-, как бы сказать... Короче, когда файл ассоциирован в реестре, то прога должна съесть его через "Открыть" или "Открыть как". Для этого ей нужен адрес файла, который передаётся в Винде через командную строку и доступен в программе как ParamStr(k);
Вот как то так... Это то, что я знаю по теме, т.к. сам щас занят чем-то подобным, но у меня почти всё уже работает))) щас забабахаю регистратор расширений, и всё
0
2 / 2 / 1
Регистрация: 24.03.2010
Сообщений: 121
17.07.2011, 21:40  [ТС]
Цитата Сообщение от Dr.Savinkov Посмотреть сообщение
UFO665, ты неправильно понял мой вопрос. У тебя прога реестр правильно изменяла? ты проверял?
Видимо неправильно) Иначе все бы работало.

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Как ты проверял что файл ассоциирован, реестр открывал???
Иконка файла изменилась на иконку программы, ну да, этого наверно недостаточно) Я с этим не сталкивался еще, в таких вопросах новичок.

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Ну и не совсем понял, программа, что должна запускаться из командной строки???
Нет, из командной строки не нужно
0
0 / 0 / 0
Регистрация: 15.07.2011
Сообщений: 15
18.07.2011, 00:05
Цитата Сообщение от UFO665 Посмотреть сообщение
Видимо неправильно) Иначе все бы работало.

Иконка файла изменилась на иконку программы, ну да, этого наверно недостаточно) Я с этим не сталкивался еще, в таких вопросах новичок.

Нет, из командной строки не нужно
--> не согласен с 1 пунктом! как уже писал, файл МОЖЕТ быть ассоциирован с программой, но БЕЗ использования ParamStr() применённое к файлу "Открыть" и "Открыть как" будут аналогичны просто запуску exe-шника программы. если можешь, скинь свою прогу или кусок кода, в котором обращаешься к файлу в первый раз. интересно посмотреть, как ты пытаешься прикрутить файл к автономной программе;
--> 2 пункт: как раз это и говорит, что расширение "как бы ассоциировано";
--> 3 пункт: смотри выше ответ Юре.

Добавлено через 2 часа 2 минуты
Вот еще нашёл статейку, поможет тем, у кого главный диск не "С" http://www.sources.ru/builder/faq/040.html
0
2 / 2 / 1
Регистрация: 24.03.2010
Сообщений: 121
18.07.2011, 10:59  [ТС]
Цитата Сообщение от Dr.Savinkov Посмотреть сообщение
скинь свою прогу или кусок кода, в котором обращаешься к файлу в первый раз. интересно посмотреть, как ты пытаешься прикрутить файл к автономной программе
Никак не прикручиваю, пытался просто ассоциировать расширение, чтобы при открытии файла запускалась программа и файл открывался в ней. Функция открытия:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void CGrafikDlg::OnFileOpen()
{
    // Стандартное окно открытия файла
    CFileDialog DlgOpen(TRUE,(LPCSTR)"grf", NULL, OFN_HIDEREADONLY,(LPCSTR)"График (*.grf) |*.grf||");
    if(DlgOpen.DoModal() == IDOK)
    {
        // ... кусок кода пропущен (он не важен)
 
        // Открытие экселевского файла и занесение в таблицу VSFlexGrid данных из него
        _ApplicationPtr app("Excel.Application");
        _WorkbookPtr book = app->Workbooks->Open((_bstr_t)str_filename);
        _WorksheetPtr sheet = book->Worksheets->GetItem(1L);
        
        spGrid->PutTextMatrix(row, 2, (_bstr_t)sheet->Cells->GetItem(8 + row, 3));
        // Далее идут аналогичные операции
        // ...
        
        app->Workbooks->Close();
        app->Quit();
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.07.2011, 10:59
Помогаю со студенческими работами здесь

Ассоциация файлов с программой
unit FileAssociation; // модуль ассоциации файлов interface uses Windows, SysUtils, Registry, ShlObj; procedure...

Ассоциация файлов с программой, открытие нескольких файлов
Я ассоциировал файлы с расширением .scr со своей программой(свойства=&gt;изменить). В свойствах приложения стоит галочка &quot;запускать...

Ассоциация файлов с моей программой на C#
Мне нужно: У меня есть файл с расширение .123, нужно чтобы этот файл открывался с помощью моей программы (То есть, Открыть с...

Ассоциация файлов с моей программой
Сделал ассоциацию файлов по примеру: https://www.cyberforum.ru/csharp-net/thread173655.html Теперь при двойном щелчу по файлу запускается...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru