CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Domyślny klient poczty

Domyślny klient poczty

dział ogólny

Domyślny klient poczty

Nowy postprzez szprotek » poniedziałek, 4 lutego 2013, 23:09

jak ustalić ścieżkę dostępu do pliku uruchamiającego domyślnego klienta poczty z poziomu BCB lub jak uruchomić z poziomu BCB domyślnego klienta poczty ?
Avatar użytkownika
szprotek
Bladawiec
Bladawiec
 
Posty: 33
Dołączył(a): niedziela, 13 lipca 2008, 21:44
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows XP, Windows 7
Kompilator: C++ Builder 6.0 Enterprise Suite,
C++ Builder 6.0 Personal
Gadu Gadu: 6403317
    Windows XPInternet Explorer 8

Re: Domyślny klient poczty

Nowy postprzez Cyfrowy Baron » wtorek, 5 lutego 2013, 10:30

Sprawdź z jakim programem powiązane jest rozszerzenie *.eml

KOD cpp:     UKRYJ  
 String TestFile = ExtractFilePath(ParamStr(0)) + "test.eml";

 FileClose(FileCreate(TestFile));

 wchar_t Exec[MAX_PATH];
 FindExecutable(TestFile.c_str(), NULL, Exec);

 DeleteFile(TestFile);

 Edit1->Text = Exec;;


W ten sposób pobierzesz ścieżkę dostępu do takiego programu.
W ten sposób możesz pobrać nazwę tego programu:

KOD cpp:     UKRYJ  
#include <stdio.h>

//---------------------------------------------------------------------------
String GetFileVersionInfo(wchar_t *ModulePath, String KeyName)
{
 LPVOID lpStr1 = NULL, lpStr2 = NULL;
 WORD* wTmp;
 DWORD dwHandlev = NULL;
 UINT dwLength;
 wchar_t sFileName[1024] = {0};
 wchar_t sTmp[1024] = {0};
 String sInfo;
 LPBYTE *pVersionInfo;

 if(ModulePath == NULL) GetModuleFileName( NULL, sFileName, 1024);
 else wcscpy(sFileName, ModulePath);

 DWORD dwInfoSize = GetFileVersionInfoSize(sFileName, &dwHandlev);

 if(dwInfoSize)
 {
  pVersionInfo = new LPBYTE[dwInfoSize];
  if(GetFileVersionInfo(sFileName, dwHandlev, dwInfoSize, pVersionInfo))
  {
   if(VerQueryValue(pVersionInfo, L"\\VarFileInfo\\Translation", &lpStr1, &dwLength))
   {
        wTmp = (WORD*)lpStr1;
        swprintf(sTmp, ("\\StringFileInfo\\%04x%04x\\" + KeyName).c_str(), *wTmp, *(wTmp + 1));
        if(VerQueryValue(pVersionInfo, sTmp, &lpStr2, &dwLength)) sInfo = (LPCTSTR)lpStr2;
   }
  }
  delete[] pVersionInfo;
 }
 return sInfo;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
 String TestFile = ExtractFilePath(ParamStr(0)) + "test.eml";

 FileClose(FileCreate(TestFile));
 wchar_t Exec[MAX_PATH];
 FindExecutable(TestFile.c_str(), NULL, Exec);

 Edit1->Text = GetFileVersionInfo(Exec,  L"ProductName");

 DeleteFile(TestFile);
 //Edit1->Text = Exec;
}
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Domyślny klient poczty

Nowy postprzez szprotek » wtorek, 5 lutego 2013, 19:06

w pierwszym przykładzie wyrzyczuca mi błąąd:

[C++ Error] Unit1.cpp(24): E2034 Cannot convert 'wchar_t *' to 'char *'
[C++ Error] Unit1.cpp(24): E2342 Type mismatch in parameter 'lpResult' (wanted 'char *', got 'wchar_t *')


domyślam się, że w funkcji FindExecutable musi być użyta zmienna typu char a nie 'wchar_t ale nie wiem co z tym zrobić.

w drugim przykładzie błędów jest jeszcze więcej ale na razie odłożyłem to na później
Avatar użytkownika
szprotek
Bladawiec
Bladawiec
 
Posty: 33
Dołączył(a): niedziela, 13 lipca 2008, 21:44
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows XP, Windows 7
Kompilator: C++ Builder 6.0 Enterprise Suite,
C++ Builder 6.0 Personal
Gadu Gadu: 6403317
    Windows XPInternet Explorer 8

Re: Domyślny klient poczty

Nowy postprzez Cyfrowy Baron » środa, 6 lutego 2013, 00:35

Kod podałem dla środowiska C++Builder XE2, gdzie domyślnym typem jest wchar_t i UnicodeString. Dla char i AnsiString powinno być chyba tak:

KOD cpp:     UKRYJ  
String GetFileVersionInfo(char *ModulePath, AnsiString KeyName)
{
 LPVOID lpStr1 = NULL, lpStr2 = NULL;
 WORD* wTmp;
 DWORD dwHandlev = NULL;
 UINT dwLength;
 char sFileName[1024] = {0};
 char sTmp[1024] = {0};
 AnsiString sInfo;
 LPBYTE *pVersionInfo;

 if(ModulePath == NULL) GetModuleFileName( NULL, sFileName, 1024);
 else strcpy(sFileName, ModulePath);

 DWORD dwInfoSize = GetFileVersionInfoSize(sFileName, &dwHandlev);

 if(dwInfoSize)
 {
  pVersionInfo = new LPBYTE[dwInfoSize];
  if(GetFileVersionInfo(sFileName, dwHandlev, dwInfoSize, pVersionInfo))
  {
   if(VerQueryValue(pVersionInfo, "\\VarFileInfo\\Translation", &lpStr1, &dwLength))
   {
        wTmp = (WORD*)lpStr1;
        sprintf(sTmp, ("\\StringFileInfo\\%04x%04x\\" + KeyName).c_str(), *wTmp, *(wTmp + 1));
        if(VerQueryValue(pVersionInfo, sTmp, &lpStr2, &dwLength)) sInfo = (LPCTSTR)lpStr2;
   }
  }
  delete[] pVersionInfo;
 }
 return sInfo;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
 AnsiString TestFile = ExtractFilePath(ParamStr(0)) + "test.eml";

 FileClose(FileCreate(TestFile));
 char Exec[MAX_PATH];
 FindExecutable( TestFile.c_str(), NULL, Exec);

 Edit1->Text = GetFileVersionInfo(Exec,  "ProductName");

 DeleteFile(TestFile);
 Edit2->Text = Exec;
}


Ja w tym kodzie jawnie użyłem typu AnsiString, gdyż w XE2 kompilator traktuje typ String jako UnicodeString. Ty jednak możesz posługiwać się typem String zamiast AnsiString.



Uzupełnij profil by było od razu widać z jakim kompilatorem i środowiskiem mamy do czynienia.


Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Domyślny klient poczty

Nowy postprzez szprotek » środa, 6 lutego 2013, 11:29

Tylko, że ja używam C++ Builder 6.0 Enterprise
Avatar użytkownika
szprotek
Bladawiec
Bladawiec
 
Posty: 33
Dołączył(a): niedziela, 13 lipca 2008, 21:44
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows XP, Windows 7
Kompilator: C++ Builder 6.0 Enterprise Suite,
C++ Builder 6.0 Personal
Gadu Gadu: 6403317
    Windows 7Internet Explorer 9

Re: Domyślny klient poczty

Nowy postprzez Cyfrowy Baron » środa, 6 lutego 2013, 11:48

Mimo to kod powinien działać. Jeżeli nie działa podaj na które linie kodu wskazuje kompilator.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Domyślny klient poczty

Nowy postprzez szprotek » środa, 6 lutego 2013, 15:33

Teraz wyskakuje mi błąd:

[Linker Error] Unresolved external 'TForm1::GetFileVersionInfoA(char *, System::AnsiString)' referenced from D:\BCB\ZZForest\UNIT1.OBJ

Avatar użytkownika
szprotek
Bladawiec
Bladawiec
 
Posty: 33
Dołączył(a): niedziela, 13 lipca 2008, 21:44
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows XP, Windows 7
Kompilator: C++ Builder 6.0 Enterprise Suite,
C++ Builder 6.0 Personal
Gadu Gadu: 6403317
    Windows XPInternet Explorer 8

Re: Domyślny klient poczty

Nowy postprzez polymorphism » środa, 6 lutego 2013, 20:42

Konsolidator nie może znaleźć definicji metody TForm1::GetFileVersionInfoA. Z tego co widzę Baron dał Ci implementację funkcji GetFileVersionInfo. Zatem dlaczego konsolidator szuka metody?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Domyślny klient poczty

Nowy postprzez Cyfrowy Baron » czwartek, 7 lutego 2013, 00:32

Coś spieprzyłeś!

Po pierwsze moja funkcja nosi nazwę GetFileVersionInfo - bez A na końcu:

KOD cpp:     UKRYJ  
String GetFileVersionInfo(char *ModulePath, AnsiString KeyName)


Skąd u Ciebie wzięło się to A?

Komunikat błędu wskazuje na TForm1::GetFileVersionInfoA(char *, System::AnsiString)', czyli wychodzi na to, że przypisałeś tą funkcję do formularza typu TForm1, a koro tak, to czy nie zapomniałeś o odpowiedniej deklaracji w pliku nagłówkowym w sekcji private:

KOD cpp:     UKRYJ  
private:
        String GetFileVersionInfoA(char *ModulePath, AnsiString KeyName);


Jeżeli modyfikujesz kod to patrz uważnie czy wszystko pozmieniałeś i pododawałeś. Jeżeli funkcja nie jest przypisana do klasy formularza to zdarzenie w którym ją wywołujesz musi znajdować się pod tą funkcją.

Sprawdź w pliku pomocy, czy w C++Builder 6 występuje funkcja GetFileVerionInfo.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Domyślny klient poczty

Nowy postprzez szprotek » czwartek, 7 lutego 2013, 09:40

Teraz zaczynam rozumieć.
Myślałem, że funkcja GetFileVersionInfo nie występuje w BCB więc zadeklarowałem ją w pliku nagłówkowym. Po usunięciu deklaracji program się kompiluje ale pojawił się nowy problem. Naciśnięcie buttona czyści zawartość pola edit nie wstawiając tam żadnej ścieżki.
Avatar użytkownika
szprotek
Bladawiec
Bladawiec
 
Posty: 33
Dołączył(a): niedziela, 13 lipca 2008, 21:44
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows XP, Windows 7
Kompilator: C++ Builder 6.0 Enterprise Suite,
C++ Builder 6.0 Personal
Gadu Gadu: 6403317
    Windows 7Internet Explorer 9

Re: Domyślny klient poczty

Nowy postprzez Cyfrowy Baron » czwartek, 7 lutego 2013, 09:49

Wstaw tu CAŁY kod. Napisz jaki program jest u ciebie domyślnym klientem poczty.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Domyślny klient poczty

Nowy postprzez szprotek » czwartek, 7 lutego 2013, 10:04

domyślny klient poczty: MS OUtlook, Windows 7, BCB 6.0 Personal

KOD cpp:     UKRYJ  
#include <stdio.h>

//---------------------------------------------------------------------------
String GetFileVersionInfo(char *ModulePath, AnsiString KeyName)
{
 LPVOID lpStr1 = NULL, lpStr2 = NULL;
 WORD* wTmp;
 DWORD dwHandlev = NULL;
 UINT dwLength;
 char sFileName[1024] = {0};
 char sTmp[1024] = {0};
 AnsiString sInfo;
 LPBYTE *pVersionInfo;

 if(ModulePath == NULL) GetModuleFileName( NULL, sFileName, 1024);
 else strcpy(sFileName, ModulePath);

 DWORD dwInfoSize = GetFileVersionInfoSize(sFileName, &dwHandlev);

 if(dwInfoSize)
 {
  pVersionInfo = new LPBYTE[dwInfoSize];
  if(GetFileVersionInfo(sFileName, dwHandlev, dwInfoSize, pVersionInfo))
  {
   if(VerQueryValue(pVersionInfo, "\\VarFileInfo\\Translation", &lpStr1, &dwLength))
   {
        wTmp = (WORD*)lpStr1;
        sprintf(sTmp, ("\\StringFileInfo\\%04x%04x\\" + KeyName).c_str(), *wTmp, *(wTmp + 1));
        if(VerQueryValue(pVersionInfo, sTmp, &lpStr2, &dwLength)) sInfo = (LPCTSTR)lpStr2;
   }
  }
  delete[] pVersionInfo;
 }
 return sInfo;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 AnsiString TestFile = ExtractFilePath(ParamStr(0)) + "test.eml";

 FileClose(FileCreate(TestFile));
 char Exec[MAX_PATH];
 FindExecutable( TestFile.c_str(), NULL, Exec);

 Edit1->Text = GetFileVersionInfo(Exec,  "ProductName");

 DeleteFile(TestFile);

 Edit1->Text = Exec;

}
//---------------------------------------------------------------------------
Avatar użytkownika
szprotek
Bladawiec
Bladawiec
 
Posty: 33
Dołączył(a): niedziela, 13 lipca 2008, 21:44
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows XP, Windows 7
Kompilator: C++ Builder 6.0 Enterprise Suite,
C++ Builder 6.0 Personal
Gadu Gadu: 6403317
    Windows 7Internet Explorer 9

Re: Domyślny klient poczty

Nowy postprzez Cyfrowy Baron » czwartek, 7 lutego 2013, 10:10

Tam w zasadzie powinieneś mieć Edit1 i Edit2, ale to nie jest błędem. Nie wiedziałem, że w Windowx 7 jest Outlook Express. Być może to wina systemu. Żeby to sprawdzić wrzuć w załączniku na forum ten program, a sprawdzę co pokazuje u mnie. Tylko dodaj tam jeszcze Edit2 i zmodyfikuj kod:

KOD cpp:     UKRYJ  
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 AnsiString TestFile = ExtractFilePath(ParamStr(0)) + "test.eml";

 FileClose(FileCreate(TestFile));
 char Exec[MAX_PATH];
 FindExecutable( TestFile.c_str(), NULL, Exec);

 Edit1->Text = GetFileVersionInfo(Exec,  "ProductName");

 DeleteFile(TestFile);

 Edit2->Text = Exec; // <-- Tutaj
}


Używaj tagów CPP wstawiając kod.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Domyślny klient poczty

Nowy postprzez szprotek » czwartek, 7 lutego 2013, 11:20

nie Outlook Expess tylko MS Outlook - ten jest częścią MS Office a nie windowsa
Avatar użytkownika
szprotek
Bladawiec
Bladawiec
 
Posty: 33
Dołączył(a): niedziela, 13 lipca 2008, 21:44
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows XP, Windows 7
Kompilator: C++ Builder 6.0 Enterprise Suite,
C++ Builder 6.0 Personal
Gadu Gadu: 6403317
    Windows 7Internet Explorer 9

Re: Domyślny klient poczty

Nowy postprzez szprotek » czwartek, 7 lutego 2013, 11:24

po zmianie kodu i dorzuczeniu Edit2 na Edit1 i Edit2 jest to samo
Avatar użytkownika
szprotek
Bladawiec
Bladawiec
 
Posty: 33
Dołączył(a): niedziela, 13 lipca 2008, 21:44
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows XP, Windows 7
Kompilator: C++ Builder 6.0 Enterprise Suite,
C++ Builder 6.0 Personal
Gadu Gadu: 6403317
    Windows 7Internet Explorer 9

Następna strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 35 gości

cron