1. Уважаемые гости и пользователи форума.
    Администрация настоятельно рекомендует не регистрировать несколько аккаунтов для одного пользователя. При выявлении наличия мультиаккаунтов будут заблокированы все учетные записи данного пользователя.
    Аккаунты, зарегистрированные на временную почту будут также заблокированы.

Проблема isJpgtoBmp

Тема в разделе "C/C++", создана пользователем sergey3695, 7 ноя 2015.

  1. Ветеран Модератор

    Регистрация:
    26 июн 2011
    Сообщения:
    914
    Симпатии:
    633
    Код (C++):
    #include <windows.h>
    #include <olectl.h>

    LPDISPATCH pImage;

    void __stdcall isJpgtoBmp(LPCTSTR pszFileName,char *outName)
    {
    HANDLE hFile=CreateFile(pszFileName,GENERIC_READ,0,NULL,
       OPEN_EXISTING,0,NULL);
    DWORD dwFileSize=GetFileSize(hFile,NULL);
    HGLOBAL hGlobalA=GlobalAlloc(GMEM_MOVEABLE,dwFileSize);
    LPVOID pvData=GlobalLock(hGlobalA);
    DWORD dwBytesRead=0;
    BOOL bReadFile=ReadFile(hFile,pvData,dwFileSize,&dwBytesRead,NULL);
    GlobalUnlock(hGlobalA);
    CloseHandle(hFile);
    LPSTREAM pst=NULL;
    HRESULT hr=CreateStreamOnHGlobal(hGlobalA,TRUE,&pst);
    if(pImage) pImage->Release();
    hr=OleLoadPicture(pst,dwFileSize,FALSE,IID_IPicture,(LPVOID*)&pImage);
    pst->Release();
    WCHAR fBuff[MAX_PATH];
    mbstowcs(fBuff,outName,sizeof(fBuff)/sizeof(WCHAR));
    OleSavePictureFile(pImage,fBuff);
    }
     
    использование
    Код (Inno):

    [Setup]
    AppName=My Program
    AppVersion=1.5
    DefaultDirName={pf}\My Program
    UninstallDisplayIcon={app}\MyProg.exe
    OutputDir=.

    [Files]
    Source: "1.jpg"; DestDir: "{tmp}"; Flags: dontcopy ignoreversion nocompression;
    Source: "MyDll.dll"; DestDir: "{tmp}"; Flags: dontcopy ignoreversion nocompression;

    [Code]
    procedure isJpgtoBmp(filename: PansiChar; name: AnsiString);
    external 'isJpgtoBmp@files:MyDll.dll stdcall delayload';

    function InitializeSetup(): Boolean;
    begin
      if not FileExists(ExpandConstant('{tmp}\MyDll.dll')) then ExtractTemporaryFile('MyDll.dll');
      if not FileExists(ExpandConstant('{tmp}\1.jpg')) then ExtractTemporaryFile('1.jpg');
      Result:= True;
    end;

    function NextButtonClick(CurPage: Integer): Boolean;
    begin
      if CurPage = wpWelcome then begin
        isJpgtoBmp(PChar(ExpandConstant('{tmp}\1.jpg')),'1');
      end;
      Result := True;
    end;
     
    проблема в том что процедура не работает (ничего не делает) (в чем ошибка в коде?) (скорее интересно как улучшить код). (установщик собирал на ansi)
     

    Вложения:

    • C++.rar
      Размер файла:
      1,3 МБ
      Просмотров:
      9
    Ramiro Cruzo нравится это.
  2. Он где то тут Администратор

    Регистрация:
    15 июн 2011
    Сообщения:
    656
    Симпатии:
    385
    У меня все работает
    Не просто 1, а полный путь.
    Код (Inno):
    isJpgtoBmp(PChar(ExpandConstant('{tmp}\1.jpeg')),'C:\321\1.bmp');
     
    sergey3695 нравится это.
  3. Ветеран Модератор

    Регистрация:
    26 июн 2011
    Сообщения:
    914
    Симпатии:
    633
    :facepalm: блин. стыдно то как. спс. не ну ппц :rofl:
    Код (C++):
    #include <windows.h>
    #include <olectl.h>

    LPDISPATCH pImage;

    void __stdcall isJpgtoBmp(LPCTSTR pszFileName,char *outName)
    {
    HANDLE hFile=CreateFile(pszFileName,GENERIC_READ,0,NULL, OPEN_EXISTING,0,NULL);
    if(!(hFile == INVALID_HANDLE_VALUE))
    {
    DWORD dwFileSize=GetFileSize(hFile,NULL);
    HGLOBAL hGlobalA=GlobalAlloc(GMEM_MOVEABLE,dwFileSize);
    LPVOID pvData=GlobalLock(hGlobalA);
    DWORD dwBytesRead=0;
    BOOL bReadFile=ReadFile(hFile,pvData,dwFileSize,&dwBytesRead,NULL);
    GlobalUnlock(hGlobalA);
    CloseHandle(hFile);
    LPSTREAM pst=NULL;
    HRESULT hr=CreateStreamOnHGlobal(hGlobalA,TRUE,&pst);
    if(pImage) pImage->Release();
    hr=OleLoadPicture(pst,dwFileSize,FALSE,IID_IPicture,(LPVOID*)&pImage);
    pst->Release();
    WCHAR fBuff[MAX_PATH];
    mbstowcs(fBuff,outName,sizeof(fBuff)/sizeof(WCHAR));
    OleSavePictureFile(pImage,fBuff);
    }
    }
     
    Krinkels, есть смысл для этой операции вместо этого сделать с использованием gdi+?
     
    Последнее редактирование: 7 ноя 2015
    Ramiro Cruzo нравится это.
  4. Он где то тут Администратор

    Регистрация:
    15 июн 2011
    Сообщения:
    656
    Симпатии:
    385
    Я с ней не работал, не подскажу
     
  5. Тех. админ Администратор

    Регистрация:
    26 дек 2011
    Сообщения:
    514
    Симпатии:
    605
    Пол:
    Мужской
    Я конечно не сишник, но разве не проще вот так написать? :)
    Код (C++):
    if(hFile != INVALID_HANDLE_VALUE)
     
    sergey3695 нравится это.
  6. Он где то тут Администратор

    Регистрация:
    15 июн 2011
    Сообщения:
    656
    Симпатии:
    385
    Тогда уж проще так:
    Код (C++):
    if( hFile == INVALID_HANDLE_VALUE )
    {
        MessageBox( 0, "Ошибка", "Внимание", 0 );
        return;
    }
     

Поделиться этой страницей