CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Problem z kompatybilnością

Problem z kompatybilnością

dział ogólny

Problem z kompatybilnością

Nowy postprzez Pitek » sobota, 8 października 2011, 15:46

Witam!
Mam problem z kompatybilnością kodu ze środowiska w wersji 2010 na nowym XE2 poniżej przedstawiam przykładowe problemy.
Kod :
KOD cpp:     UKRYJ  
sprintf(sTmp, ("\\StringFileInfo\\%04x%04x\\" + KeyName).t_str(), *wTmp, *(wTmp + 1));

Jest to jedna z linijek funkcji pobierającej wersję programu wyrzuca mi takie błędy :

[BCC32 Error] Unit1.cpp(115): E2034 Cannot convert 'wchar_t *' to 'const char *'
Full parser context
Unit1.cpp(93): parsing: UnicodeString GetFileVersionInfoA(char *,UnicodeString)
[BCC32 Error] Unit1.cpp(115): E2342 Type mismatch in parameter '__format' (wanted 'const char *', got 'wchar_t *')
Full parser context
Unit1.cpp(93): parsing: UnicodeString GetFileVersionInfoA(char *,UnicodeString)


Dalej dla poniższej budowy MessageBox'a :
KOD cpp:     UKRYJ  
MessageBox(NULL,("Text"+zmiennaString+"tekst").t_str() ,"Tekst",MB_ICONINFORMATION);

są takie błędy :

[BCC32 Warning] Unit1.cpp(352): W8111 Accessing deprecated entity '_fastcall UnicodeString::t_str() const'
Full parser context
Unit1.cpp(125): parsing: void _fastcall TForm1::Button1Click(TObject *)
[BCC32 Error] Unit1.cpp(352): E2034 Cannot convert 'wchar_t *' to 'const char *'
Full parser context
Unit1.cpp(125): parsing: void _fastcall TForm1::Button1Click(TObject *)
[BCC32 Error] Unit1.cpp(352): E2342 Type mismatch in parameter 'lpText' (wanted 'const char *', got 'wchar_t *')
Full parser context
Unit1.cpp(125): parsing: void _fastcall TForm1::Button1Click(TObject *)


Jest tego więcej.... podam jeszcze jeden :
KOD cpp:     UKRYJ  
String nazwa,nazwa2;
nazwa = ExtractFileName(Application->ExeName);
nazwa2 = ExtractFileName(Application->ExeName);
nazwa2 = nazwa2+"_restart";
  restart = true;
  if(SaveOnClose(Sender))
  {
           HANDLE hEvent = CreateEvent(NULL,FALSE,FALSE,nazwa2.t_str());
           if(hEvent)
           {
                   ShellExecute(NULL,"open",nazwa.t_str(),NULL,NULL,SW_SHOW);
                   static signal_event_at_end tmp(hEvent);
                   Close();
           }
  }

Błąd :

[BCC32 Warning] Unit1.cpp(4849): W8111 Accessing deprecated entity '_fastcall UnicodeString::t_str() const'
Full parser context
Unit1.cpp(4841): parsing: void _fastcall TForm1::Nowy2Click(TObject *)
[BCC32 Error] Unit1.cpp(4849): E2034 Cannot convert 'wchar_t *' to 'const char *'
Full parser context
Unit1.cpp(4841): parsing: void _fastcall TForm1::Nowy2Click(TObject *)
[BCC32 Error] Unit1.cpp(4849): E2342 Type mismatch in parameter 'lpName' (wanted 'const char *', got 'wchar_t *')
Full parser context
Unit1.cpp(4841): parsing: void _fastcall TForm1::Nowy2Click(TObject *)
[BCC32 Warning] Unit1.cpp(4852): W8111 Accessing deprecated entity '_fastcall UnicodeString::t_str() const'
Full parser context
Unit1.cpp(4841): parsing: void _fastcall TForm1::Nowy2Click(TObject *)
[BCC32 Error] Unit1.cpp(4852): E2034 Cannot convert 'wchar_t *' to 'const char *'
Full parser context
Unit1.cpp(4841): parsing: void _fastcall TForm1::Nowy2Click(TObject *)
[BCC32 Error] Unit1.cpp(4852): E2342 Type mismatch in parameter 'lpFile' (wanted 'const char *', got 'wchar_t *')
Full parser context
Unit1.cpp(4841): parsing: void _fastcall TForm1::Nowy2Click(TObject *)


Pierwsze trzy błędy dotyczną linijki z HANDLE a pozostałe z ShellExecute.
Proszę o pomoc bo nie wiem jak ten kod przerobić żeby działał.
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    Windows 7Firefox

Re: Problem z kompatybilnością

Nowy postprzez Cyfrowy Baron » sobota, 8 października 2011, 15:58

To nie jest problem kompatybilności, tylko Ty niewłaściwie operujesz typami zmiennych lub masz źle ustawione mapowanie.
Zapoznaj się z tym postem: http://programowanie.cal.pl/forum/viewtopic.php?f=16&t=1098#p7401
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: Problem z kompatybilnością

Nowy postprzez Pitek » sobota, 8 października 2011, 18:09

Dziękuję bardzo za odpowiedź w wielu przypadkach to pomogło.
Pomogło również umieszczenie L przed " w MessageBox'ach.
Jednak nie potrafię poradzić sobie z tą funkcją pobierania wersji programu :
KOD cpp:     UKRYJ  
//--------------------------------

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

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

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

//--------------------------------

Błędy :

[BCC32 Error] Unit1.cpp(104): E2034 Cannot convert 'char[1024]' to 'wchar_t *'
Full parser context
Unit1.cpp(94): parsing: UnicodeString GetFileVersionInfoW(char *,UnicodeString)
[BCC32 Error] Unit1.cpp(104): E2342 Type mismatch in parameter 'lpFilename' (wanted 'wchar_t *', got 'char *')
Full parser context
Unit1.cpp(94): parsing: UnicodeString GetFileVersionInfoW(char *,UnicodeString)
[BCC32 Error] Unit1.cpp(107): E2034 Cannot convert 'char[1024]' to 'const wchar_t *'
Full parser context
Unit1.cpp(94): parsing: UnicodeString GetFileVersionInfoW(char *,UnicodeString)
[BCC32 Error] Unit1.cpp(107): E2342 Type mismatch in parameter 'lptstrFilename' (wanted 'const wchar_t *', got 'char *')
Full parser context
Unit1.cpp(94): parsing: UnicodeString GetFileVersionInfoW(char *,UnicodeString)
[BCC32 Error] Unit1.cpp(111): E2285 Could not find a match for 'GetFileVersionInfoW(char *,unsigned long,unsigned long,void * *)'
Full parser context
Unit1.cpp(94): parsing: UnicodeString GetFileVersionInfoW(char *,UnicodeString)
[BCC32 Error] Unit1.cpp(111): E2285 Could not find a match for 'GetFileVersionInfoW(char *,unsigned long,unsigned long,void * *)'
Full parser context
Unit1.cpp(94): parsing: UnicodeString GetFileVersionInfoW(char *,UnicodeString)
[BCC32 Error] Unit1.cpp(113): E2034 Cannot convert 'char const[25]' to 'const wchar_t *'
Full parser context
Unit1.cpp(94): parsing: UnicodeString GetFileVersionInfoW(char *,UnicodeString)
[BCC32 Error] Unit1.cpp(113): E2342 Type mismatch in parameter 'lpSubBlock' (wanted 'const wchar_t *', got 'const char *')
Full parser context
Unit1.cpp(94): parsing: UnicodeString GetFileVersionInfoW(char *,UnicodeString)
[BCC32 Warning] Unit1.cpp(116): W8111 Accessing deprecated entity '_fastcall UnicodeString::t_str() const'
Full parser context
Unit1.cpp(94): parsing: UnicodeString GetFileVersionInfoW(char *,UnicodeString)
[BCC32 Error] Unit1.cpp(116): E2034 Cannot convert 'wchar_t *' to 'const char *'
Full parser context
Unit1.cpp(94): parsing: UnicodeString GetFileVersionInfoW(char *,UnicodeString)
[BCC32 Error] Unit1.cpp(116): E2342 Type mismatch in parameter '__format' (wanted 'const char *', got 'wchar_t *')
Full parser context
Unit1.cpp(94): parsing: UnicodeString GetFileVersionInfoW(char *,UnicodeString)
[BCC32 Error] Unit1.cpp(117): E2034 Cannot convert 'char[1024]' to 'const wchar_t *'
Full parser context
Unit1.cpp(94): parsing: UnicodeString GetFileVersionInfoW(char *,UnicodeString)
[BCC32 Error] Unit1.cpp(117): E2342 Type mismatch in parameter 'lpSubBlock' (wanted 'const wchar_t *', got 'char *')
Full parser context
Unit1.cpp(94): parsing: UnicodeString GetFileVersionInfoW(char *,UnicodeString)


Mam jeszcze problem jak przy ustawieniu wchar_t uzyskać jednak char ponieważ używam funkcji system która oczekuje char.
A cała reszta działa chociaż wyskakują takie Warningi :

[BCC32 Warning] Unit1.cpp(649): W8111 Accessing deprecated entity '_fastcall UnicodeString::t_str() const'
Full parser context
Unit1.cpp(623): parsing: void _fastcall TForm1::Button5Click(TObject *)


Odnoszą się one do MessageBox'ów pisane są one w takie sposób jak opisuję to w moim pierwszym poście.
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    Windows 7Firefox

Re: Problem z kompatybilnością

Nowy postprzez Cyfrowy Baron » sobota, 8 października 2011, 21:42

Gotowy kod dla mapowania ustawionego na wchar_t:

KOD cpp:     UKRYJ  
String GetFileVersionInfo(char *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};
 UnicodeString sInfo;
 LPVOID* pVersionInfo;

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

 DWORD dwInfoSize = GetFileVersionInfoSize(sFileName, &dwHandlev);

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


pitek3010 napisał(a):Mam jeszcze problem jak przy ustawieniu wchar_t uzyskać jednak char ponieważ używam funkcji system która oczekuje char.


Jeżeli funkcja oczekuje char to ustawienie mapowania nie ma znaczenia, gdyż takiej funkcji zawsze przekazujesz char.. W większości funkcji zmiana mapowania powoduje również zmianę typu zmiennych oczekiwanych przez funkcję. Po prostu biblioteki zawierają dwa zestawy funkcji dla UnicodeString i wchar_t oraz dla AnsiString i char. Nie dotyczy to jednak wszystkich funkcji, niektóre działają tylko z wchar_t a inne tylko z char.

pitek3010 napisał(a):A cała reszta działa chociaż wyskakują takie Warningi :


Nie wiem czego to się tyczy. Jaki kod znajduje się w linii 646?

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
Pitek
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: Problem z kompatybilnością

Nowy postprzez Pitek » sobota, 8 października 2011, 22:43

Bardzo dziękuję !
Nie potrafię sobie jeszcze poradzić z tym :
KOD cpp:     UKRYJ  
String wersja,nazwa;
nazwa = ExtractFileName(Application->ExeName);
wersja = GetFileVersionInfo(nazwa.t_str(), L"FileVersion");


[BCC32 Error] Unit10.cpp(100): E2285 Could not find a match for 'GetFileVersionInfoW(wchar_t *,const wchar_t *)'
Full parser context
Unit10.cpp(97): parsing: void _fastcall TForm10::FormShow(TObject *)


I z tym (to ta funkcja system o której pisałem) :
KOD cpp:     UKRYJ  
String nazwa3,nazwa4;
nazwa3 = ExtractFileName(Application->ExeName);
nazwa4 = "taskkill /im "+nazwa3+" /f /t";
system(nazwa4.t_str());


[BCC32 Error] Unit1.cpp(4891): E2034 Cannot convert 'wchar_t *' to 'const char *'
Full parser context
Unit1.cpp(4886): parsing: void _fastcall TForm1::Zakoczprzyzawieszeniu1Click(TObject *)
[BCC32 Error] Unit1.cpp(4891): E2342 Type mismatch in parameter '__command' (wanted 'const char *', got 'wchar_t *')
Full parser context
Unit1.cpp(4886): parsing: void _fastcall TForm1::Zakoczprzyzawieszeniu1Click(TObject *)



A jeżeli chodzi o te warningi to kod który znajduje się w tej linii to :
KOD cpp:     UKRYJ  
MessageBox (NULL, ("Nie można odnaleźć : „" + LabeledEdit3->Text+"”").t_str() ,L"Znajdź",  MB_ICONINFORMATION);

Warning'ów tego typu mam pełno i to właśnie w większości przypadków do MessageBox'ów takich jak powyżej.
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    Windows 7Firefox

Re: Problem z kompatybilnością

Nowy postprzez Cyfrowy Baron » niedziela, 9 października 2011, 08:54

pitek3010 napisał(a):Nie potrafię sobie jeszcze poradzić z tym :


Z treści błędu wynika, że zdarzenie OnShow dla Form10 nie widzi funkcji GetFileVersionInfo, pewnie dlatego, że umieściłeś ciało tej funkcji pod tym zdarzeniem, a funkcja nie jest metodą klasy dla TForm10. Funkcja nie będąca metodą klasy, czyli tutaj nie mająca swojej deklaracji w pliku nagłówkowym w sekcji private lub public, musi znajdować się nad funkcją, która ją wywołuje:
Przykład:

ŻLE:
KOD cpp:     UKRYJ  
void __fastcall TForm10::FormShow(TObject *Sender)
{
 AnsiString nazwa;
 String wersja;
 nazwa = ExtractFileName(Application->ExeName);
 wersja = GetFileVersionInfo(nazwa.c_str(), "FileVersion");
}
//------------------------------------------------
String GetFileVersionInfo(char *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};
 UnicodeString sInfo;
 LPVOID* pVersionInfo;

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

 DWORD dwInfoSize = GetFileVersionInfoSize(sFileName, &dwHandlev);

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


DOBRZE:
KOD cpp:     UKRYJ  
String GetFileVersionInfo(char *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};
 UnicodeString sInfo;
 LPVOID* pVersionInfo;

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

 DWORD dwInfoSize = GetFileVersionInfoSize(sFileName, &dwHandlev);

 if(dwInfoSize)
 {
  pVersionInfo = new LPVOID[dwInfoSize];
  if(GetFileVersionInfo(sFileName, dwHandlev, dwInfoSize, pVersionInfo))
  {
   if(VerQueryValue(pVersionInfo, L"\\VarFileInfo\\Translation", &lpStr1, &dwLength))
   {
        wTmp = (WORD*)lpStr1;
        swprintf(sTmp, ("\\StringFileInfo\\%04x%04x\\" + KeyName).w_str(), *wTmp, *(wTmp + 1));
        if(VerQueryValue(pVersionInfo, sTmp, &lpStr2, &dwLength)) sInfo = (LPCTSTR)lpStr2;
   }
  }
  delete[] pVersionInfo;
 }
 return sInfo;
}
//------------------------------------------------------------
void __fastcall TForm10::FormShow(TObject *Sender)
{
 AnsiString nazwa;
 String wersja;
 nazwa = ExtractFileName(Application->ExeName);
 wersja = GetFileVersionInfo(nazwa.c_str(), "FileVersion");
}
 


U Ciebie błąd może być jeszcze spowodowany tym, że przekazujesz funkcji GetFileVersionInfo jako argumenty, zmienne niewłaściwych typów. Jakich typów oczekuje zaprezentowana przeze mnie funkcja:

String GetFileVersionInfo(char *ModulePath, String KeyName)

Pierwszy argument jest typu char, drugi argument jest typu UnicodeString, a co Ty im przekazujesz:

wersja = GetFileVersionInfo(nazwa.t_str(), L"FileVersion");

Jako pierwszy argument przekazujesz tam wchar_t zamiast char, jako drugi również wchar_t, ale tym razem zamiast UnicodeStirng. Tymczasem funkcję wystarczy wywołać tak:

KOD cpp:     UKRYJ  
String wersja = GetFileVersionInfo(NULL, "FileVersion");


Wystarczy NULL zamiast nazwy pliku programu, gdyż funkcja GetModuleFileName będąca składową funkcji GetFileVersionInfo otrzymując jako pierwszy argument NULL sama pobierze sobie nazwę aplikacji, co zresztą jest napisane w pliku pomocy:
Plik pomocy napisał(a):hModule
[in] Handle to the loaded module whose path is being requested. If this parameter is NULL, GetModuleFileName retrieves the path of the executable file of the current process.


Gdybyś jednak chciał tam przekazać nazwę aplikacji to tak jak to Ty robisz powinno wyglądać:

KOD cpp:     UKRYJ  
AnsiString nazwa;
 String wersja;
 nazwa = ExtractFileName(Application->ExeName);
 wersja = GetFileVersionInfo( nazwa.c_str(), "FileVersion");


pitek3010 napisał(a):I z tym (to ta funkcja system o której pisałem) :


Funkcja system oczekuje zmiennej typu char a nie wchar_t, a Ty przekazujesz jej właśnie wchar_t. Powinno być tak:

KOD cpp:     UKRYJ  
String nazwa3 = ExtractFileName(Application->ExeName);
 nazwa3 = nazwa3.Insert("taskkill /im ", 1);
 nazwa3 = nazwa3.Insert(" /f /t", nazwa3.Length() + 1);
 system( (LPSTR)nazwa3.c_str() );


Tutaj od razu Ciebie zmartwię, to nie zadziała. Funkcja system jest przeznaczona dla aplikacji konsolowych, a nie okienkowych. Nie bardzo rozumiem co chcesz w ten sposób osiągnąć. Chcesz aby aplikacja wymusiła własne zamknięcie? Jeżeli tak to są prostsze metody:
KOD cpp:     UKRYJ  
Application->Terminate();


A jeżeli chcesz dobrać się bezpośrednio do procesu i tak go zamknąć, to możesz to zrobić tak:

KOD cpp:     UKRYJ  
void ErrorExit(String lpFun)
{
   LPVOID lpMsgBuf;
    LPVOID lpDisplayBuf;

    DWORD dw = GetLastError();

    FormatMessage(
        FORMAT_MESSAGE_ALLOCATE_BUFFER |
        FORMAT_MESSAGE_FROM_SYSTEM,
        NULL,
        dw,
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
        (LPTSTR) &lpMsgBuf,
        0, NULL );

    lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT,
                (lstrlen((LPCTSTR)lpMsgBuf)+lstrlen(lpFun.t_str())+40)*sizeof(TCHAR));
    wsprintf((LPTSTR)lpDisplayBuf,
        TEXT("%s failed with error %d: %s"),
                lpFun, dw, lpMsgBuf);
        MessageBox(NULL, (LPCTSTR)lpDisplayBuf, TEXT("Error"), MB_OK);

    LocalFree(lpMsgBuf);
    LocalFree(lpDisplayBuf);
        ExitProcess(dw);
}
//---------------------------------------------------------------------------
void __fastcall CloseProcess(String ProcesName)
{
 DWORD ExitCode;
 HANDLE Snap;
 PROCESSENTRY32 proces;

 Snap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 proces.dwSize = sizeof(PROCESSENTRY32);

 if(Process32First(Snap, &proces))
 {
  do
  {
   if(proces.szExeFile[0] != '[')
   {
        if(SameText(proces.szExeFile, ProcesName))
        {

         TOKEN_PRIVILEGES tPriv;
         LUID luid;

         HANDLE hWndTok;
         if(!OpenProcessToken(GetCurrentProcess(),
                 TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hWndTok))
         {
                        ErrorExit("OpenProcessToken: ");
         }

         if(!LookupPrivilegeValue(NULL, "SeDebugPrivilege", &luid ))
          ErrorExit("LookupPrivilegeValue: ");

         tPriv.PrivilegeCount = 1;
         tPriv.Privileges[0].Luid = luid;
         tPriv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

         if(!AdjustTokenPrivileges(hWndTok, false, &tPriv,
                                                          sizeof(TOKEN_PRIVILEGES),
                                                          (PTOKEN_PRIVILEGES) NULL,
                                                          (PDWORD) NULL))
         {
          ErrorExit("AdjustTokenPrivileges: ");
         }

         HANDLE hWnd = OpenProcess(PROCESS_ALL_ACCESS, false, proces.th32ProcessID);
         if(GetLastError() > 0) ErrorExit("OpenProcess: ");
         if(hWnd)
         {
          GetExitCodeProcess(hWnd, &ExitCode);
          TerminateProcess(hWnd, ExitCode);
         }
         CloseHandle(hWnd);
         return;
         }
        }
   }while(Process32Next(Snap , &proces));
 }
 CloseHandle(Snap);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  CloseProcess( ExtractFilePath( ParamStr(0) ) );
}


pitek3010 napisał(a):A jeżeli chodzi o te warningi to kod który znajduje się w tej linii to :


U mnie nie ma takiego komunikatu, ale jeżeli używasz mapowania na wchar_t to zamiast metody t_str, używaj c_str(), albo w_str() i powinno być dobrze. Gdybyś zresztą przeanalizował kod, który Tobie dałem, to zobaczyłbyś, że zamiast t_str() stosuję w_str().

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
Pitek
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: Problem z kompatybilnością

Nowy postprzez Pitek » niedziela, 9 października 2011, 14:58

Bardzo dziękuję za poświęcony czas i kompleksową odpowiedź!
Jeżeli chodzi o problem z funkcją GetFileVersionInfo to wiem że należy dać ją przed miejscem jej wywołania, trafne okazało się to co Pan pisze dalej...
Wiedziałem że zmienne przekazywane do funkcji są złe nie wiedziałem tylko jak przekazać dobre. Zapis z AnsiString okazał się tym o co chodziło ;)
Po wpisaniu NULL dla innego okna niż Form1, gdzie u mnie jest to główna forma, funkcja zwracała : 1.0.0.000 co jest niezgodne z prawdą.
Swoją drogą to nie wiem czemu tak bo skoro inne okna uruchamiane są z Form1 to jakby należą do niego i powinny odnosić również do niego... więc nie wiem skąd ta wartość...(nie wiem czy dobrze rozumuje).
A sprawa z funkcją system to w sumie tak dla samej wiedzy bo już z niej nie korzystam w moim programie, chodziło mi o to jak tam przekazać char a nie wchar_t.
Najlepsze jest to że mi to działało w aplikacji okienkowej :o
Dziękuję za przykłady alternatywnego rozwiązania.
A te warningi to wszędzie pozamieniałem .t_str() na .w_str() i zniknęły :)

Jeszcze raz dziękuję za pomoc i pozdrawiam!
Pitek
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    Windows XPFirefox

Re: Problem z kompatybilnością

Nowy postprzez Cyfrowy Baron » niedziela, 9 października 2011, 15:47

pitek3010 napisał(a):o wpisaniu NULL dla innego okna niż Form1, gdzie u mnie jest to główna forma, funkcja zwracała : 1.0.0.000 co jest niezgodne z prawdą.


Jakoś nietypowo. Widocznie w nowszych wersjach środowiska coś się pozmieniało. U mnie NULL działa niezależnie od tego z jakiego formularza jest wywoływana funkcja. Zakładam oczywiście, że numer wersji programu zdefiniowałeś prawidłowo, czyli w opcjach projektu.
By się upewnić jak to jest u Ciebie wejdź do pliku pomocy pod hasło GetModuleFileName i sprawdź co tam piszą na temat pierwszego argumentu funkcji.
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: Problem z kompatybilnością

Nowy postprzez Pitek » niedziela, 9 października 2011, 16:55

Hm... stała się dość ciekawa rzecz, mianowicie po zweryfikowaniu ustawień dotyczących automatycznej inkrementacji wersji programu itd. oraz po zamknięciu środowiska i ponownym jego otwarciu, sposób ze zmienną AnsiString w ogóle nie chciał zwracać żadnej wartości a zaczął działać sposób z NULL :o :o to znaczy, zaczął zwracać prawidłową wartość sądzę że to wszystko przez to przeniesienie projektu z 2010 do XE2 poprostu niektóre rzeczy trzeba jakby jeszcze raz potwierdzić itd. np. miałem problem ze ścieżkami do bibliotek które też musiałem ręcznie naprawić... No nic ważne że działa tylko nie wiem czemu nie działa z tym stringiem, a u mnie w pliku pomocy pisze to samo co w tym z wersji 2010.
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    Windows XPFirefox

Re: Problem z kompatybilnością

Nowy postprzez Cyfrowy Baron » niedziela, 9 października 2011, 18:40

pitek3010 napisał(a):No nic ważne że działa tylko nie wiem czemu nie działa z tym stringiem,


Sprawdź to, ale uruchamiając aplikację samodzielnie, nie poprzez środowisko C++Builder.
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: Problem z kompatybilnością

Nowy postprzez Pitek » niedziela, 9 października 2011, 20:48

Dalej nie działa...
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    Windows XPFirefox

Re: Problem z kompatybilnością

Nowy postprzez Cyfrowy Baron » niedziela, 9 października 2011, 21:11

Stwórz nowy projekt testowy w nowym środowisku i tak sprawdź czy to wina kodu, czy też ma to związek z tym, że projekt został przekonwertowany.
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: Problem z kompatybilnością

Nowy postprzez Pitek » sobota, 26 listopada 2011, 14:34

W nowym projekcie nadal to nie działa w ten sposób a pojawił mi się nowy problem. Mianowicie w wersji 2010 korzystałem z komponentu INDY IdAntiFreez i teraz mam taki błąd przy kompilacji :

[ILINK32 Error] Fatal: Unable to open file 'IDANTIFREEZE.OBJ'


Wywaliłem wszystkie linkowania do tego bo samego komponentu już na formatce nie było po otwarciu w XE2 i pojawia się taki błąd może da się jakoś porostu usunąć ten OBJ żeby nie brał go pod uwagę lub coś w tym stylu?
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    Windows XPFirefox

Re: Problem z kompatybilnością

Nowy postprzez Cyfrowy Baron » sobota, 26 listopada 2011, 16:08

Musisz ręcznie usunąć wpis z pliku projektu. Nie wiem jak to jest poukładane w XE2, ale w BDS 2010 wygląda to tak np.:

[text]<PackageImports>vcl.bpi;rtl.bpi;bcbie.bpi;vclx.bpi;vclactnband.bpi;xmlrtl.bpi;bcbsmp.bpi;vclimg.bpi;dbrtl.bpi;vcldb.bpi;vcldbx.bpi;bdertl.bpi;vcltouch.bpi;dsnap.bpi;dsnapcon.bpi;TeeUI.bpi;TeeDB.bpi;Tee.bpi;vclib.bpi;ibxpress.bpi;adortl.bpi;IndyCore.bpi;IndySystem.bpi;IndyProtocols.bpi;inet.bpi;intrawebdb_100_140.bpi;Intraweb_100_140.bpi;vclie.bpi;websnap.bpi;webdsnap.bpi;inetdb.bpi;inetdbbde.bpi;inetdbxpress.bpi;soaprtl.bpi;vclribbon.bpi;dbexpress.bpi;DbxCommonDriver.bpi;DataSnapIndy10ServerTransport.bpi;DataSnapProviderClient.bpi;DbxClientDriver.bpi;DataSnapServer.bpi;DBXInterBaseDriver.bpi;DBXMySQLDriver.bpi;dbxcds.bpi;DBXFirebirdDriver.bpi;DBXSybaseASEDriver.bpi;DBXSybaseASADriver.bpi;DBXOracleDriver.bpi;DBXMSSQLDriver.bpi;DBXInformixDriver.bpi;DBXDb2Driver.bpi;Rave77VCL.bpi;lmdrtl10rt_140.bpi;lmdrtlx10rt_140.bpi;vclZipForged13.bpi;lmdplugin10rt_140.bpi;lmdcore10rt_140.bpi;dclZipForged13.bpi;tmsd2010.bpi;VclSmp.bpi;tmsexd2010.bpi;tmswizd2010.bpi;tmsxlsd2010.bpi</PackageImports>

<AllPackageLibs>rtl.lib;vcl.lib;inet.lib;webdsnap.lib;inetdb.lib;dbrtl.lib;xmlrtl.lib;dsnapcon.lib;dsnap.lib;vcldb.lib;WinSkinc2010.lib;vclactnband.lib;vclx.lib;vclZipForged13.lib;vclie.lib;bcbie.lib;lmdrtlx10rt_140.lib;lmdrtl10rt_140.lib;lmdcore10rt_140.lib;tmsd2010.lib;adortl.lib;bdertl.lib;vclimg.lib;VclSmp.lib;PicButton_pak.lib;skinpackcb2010.lib;tmsexd2010.lib;TeeUI.lib;Tee.lib;bcbsmp.lib;vcwb2010.lib</AllPackageLibs>
<LinkPackageStatics>rtl.lib;vcl.lib;inet.lib;webdsnap.lib;inetdb.lib;dbrtl.lib;xmlrtl.lib;dsnapcon.lib;dsnap.lib;vcldb.lib;WinSkinc2010.lib;vclactnband.lib;vclx.lib;vclZipForged13.lib;vclie.lib;bcbie.lib;lmdrtlx10rt_140.lib;lmdrtl10rt_140.lib;lmdcore10rt_140.lib;tmsd2010.lib;adortl.lib;bdertl.lib;vclimg.lib;VclSmp.lib;PicButton_pak.lib;skinpackcb2010.lib;tmsexd2010.lib;TeeUI.lib;Tee.lib;bcbsmp.lib;vcwb2010.lib</LinkPackageStatics>[text]

A po usunięciu powinno wyglądać tak:

[text]<PackageImports></PackageImports>
<AllPackageLibs></AllPackageLibs>
<LinkPackageStatics></LinkPackageStatics>[text]


Po skompilowaniu i tak zostaną dodane używane w projekcie biblioteki.
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: Problem z kompatybilnością

Nowy postprzez Pitek » sobota, 26 listopada 2011, 16:19

Nic to nie dało zaznaczam że to nie 'IDANTIFREEZE.LIB' tylko 'IDANTIFREEZE.OBJ' może o to chodzi ?
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    Windows XPFirefox

Następna strona

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 4 gości