Полезные исходники для Windows

Всё, что касается программирования на старых языках или для старых систем

Полезные исходники для Windows

Сообщение longhorn_gnu » 25 сен 2023, 08:22

Тема сделана для того, чтобы товарищ rvg и другие, могли выкладывать исходники мелких программ и утилит для Windows.
its end?
Аватара пользователя
longhorn_gnu
Мастер Даунгрейда
 
Сообщения: 774
Зарегистрирован: 05 июн 2023, 08:32
Откуда: telegram: @sdl_sdl_sdl_ps_dpl
Железо: deleted

Re: Полезные исходники для Windows

Сообщение rvg » 25 сен 2023, 08:37

longhorn_gnu, приветствую! И всех обитателей форума Старого Дос!
:P
Последний раз редактировалось rvg 30 сен 2023, 08:43, всего редактировалось 3 раз(а).
Аватара пользователя
rvg
Мастер Даунгрейда
 
Сообщения: 661
Зарегистрирован: 18 июл 2023, 14:12

Re: Полезные исходники для Windows

Сообщение longhorn_gnu » 25 сен 2023, 08:50

rvg писал(а):Вообще у меня такая идея появилась (с тех пор когда я увидел вашу любовь
к БАТ-файлам). Так думаю. Сейчас накатаю простенькую программу на Си
и на Асме. Смысл програмvы будет следующей. Вы пишет обычный БАТ.
Собираете программу и происходит запуск вашего БАТ. Годится?

Такая программа была бы полезна не только мне, но и другим пользователям BAT. С древних времён, мы с Семенцулом пользовались корявыми конвертерами типа этих: http://old-dos.ru/index.php?page=files& ... ow&id=7740 и https://bat-to-exe-converter-x64.en.softonic.com/ . Они очень сильно срут в системе как и у создателя батников, так и у пользователя. Я давно пытался найти нормальный конвертер. Всё без толку. А ваша программа должна решить эту проблему.
its end?
Аватара пользователя
longhorn_gnu
Мастер Даунгрейда
 
Сообщения: 774
Зарегистрирован: 05 июн 2023, 08:32
Откуда: telegram: @sdl_sdl_sdl_ps_dpl
Железо: deleted

Re: Полезные исходники для Windows

Сообщение rvg » 25 сен 2023, 10:04

longhorn_gnu писал(а):Такая программа была бы полезна не только мне, но и другим пользователям BAT. С древних времён, мы с Семенцулом пользовались ...

Ну вот поэтому мне и хотелось вас (обоих) подтолкнуть к томк, что волей не волей но вы вникните и в обычный стиль программирования.
Но как всегда есть Но - это то, что с каждой версией Windows, после Xp,
Microsoft затрудняет запуск командных файлов программно. Например.
Столкнулся я в Седьмой Windows с тем, что нельзя выполнить ряд команд,
которые свободно выполняются в предидущей версии. Приходилось изголятся
с помощью программного нажатия мышки/клавиатуры, но это уже называется
костыльная работа.
Нет, но я покажу, что обещал. Сначала думаю минимальный вариант и по задействованию времени на это. Ведь время летит очень быстро когда этим занимаешься. Поэтому не очень хочется засиживаться на месте. В общем постараюсь.
Последний раз редактировалось uav 30 ноя 2023, 01:23, всего редактировалось 1 раз.
Причина: Восстановление повреждённого сообщения
Аватара пользователя
rvg
Мастер Даунгрейда
 
Сообщения: 661
Зарегистрирован: 18 июл 2023, 14:12

Re: Полезные исходники для Windows

Сообщение longhorn_gnu » 25 сен 2023, 10:08

rvg писал(а):Но - это то, что с каждой версией Windows, после Xp,
Microsoft затрудняет запуск командных файлов программно.

Это я знаю.
its end?
Аватара пользователя
longhorn_gnu
Мастер Даунгрейда
 
Сообщения: 774
Зарегистрирован: 05 июн 2023, 08:32
Откуда: telegram: @sdl_sdl_sdl_ps_dpl
Железо: deleted

Re: Полезные исходники для Windows

Сообщение rvg » 25 сен 2023, 10:18

longhorn_gnu писал(а):Это я знаю.

Ну-и вот. И ещё. Например если мы будем пытаться обходить преграды, (вы), (не я) станете объектом наблюдения, что нежелательно. Это я конечно преувеличиваю, но не исключаю. Всё такое смотрится.
Так что отмена. Примера не будет. Дети начитаются и винты полетят, не надо ;)
(не в обиду, я уже устал, просто представил, открыл свой загашник как представил и не захотел, извините)
Последний раз редактировалось uav 30 ноя 2023, 01:23, всего редактировалось 3 раз(а).
Аватара пользователя
rvg
Мастер Даунгрейда
 
Сообщения: 661
Зарегистрирован: 18 июл 2023, 14:12

RasConnect - программа для подключения DSL

Сообщение rvg » 25 сен 2023, 10:44

RasConnect - программа для подключения DSL, при использовании модема в качестве моста (bridge).

Я сделал её, чтобы выбирать IP-адрес назначенный провайдером.
Дело в том, что у меня выдется из трех возможных подсетей, поэтому,
чтобы не переподключаться с помощью Windows (там нужно смотреть
свойства и статус - это несколько нажатий), программа же сразу покажет.
Программа спросит: переподключиться (показывая текущий IP)?

 Развернуть: RasConnect.cpp
Код: Выделить всё
// RasConnect.cpp

#if _MSC_VER >= 1200
#pragma comment(lib,"rasapi32.lib")
#endif // end _MSC_VER

#include <windows.h>
#include <Ras.h>
#include <RasError.h>
#include "resource.h"

char* GAppname="Ras Connect'";
char g_szEntryName[1024];

void mb(char*);
BOOL GetOs();
BOOL CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE,LPSTR,int)
{
   /*-------------------------------------------------------
      Запускать только одну копию программы
   -------------------------------------------------------*/
   CreateMutex(NULL,0,GAppname);
   BOOL AlreadyRunning=(GetLastError()==ERROR_ALREADY_EXISTS);
   if(AlreadyRunning)
   return 0;

   if(!GetOs())
   mb("Failed - Программа предназначена для Windows NT/2000/XP.");

   /*-------------------------------------------------------
      Установить активные подключения.
   -------------------------------------------------------*/
   BOOL bConnected=FALSE;
   RASCONN rasConn;
   RASCONNSTATUS rasConnStatus;
   rasConn.dwSize=sizeof(RASCONN);
   DWORD cb, Connections;
   cb=sizeof(RASCONN);

   if(!RasEnumConnections(&rasConn,&cb,&Connections))
   {
      for(DWORD i=0; i < Connections; ++i)
      {
         rasConnStatus.dwSize=sizeof(RASCONNSTATUS);
         RasGetConnectStatus(rasConn.hrasconn,&rasConnStatus);
         if(RASCS_Connected==rasConnStatus.rasconnstate)
         {
            lstrcpy(g_szEntryName,rasConn.szEntryName);
            bConnected=TRUE;
            break;
         }
      }
   }

   if(!bConnected)
   {
      RASCONN rasconn[20];
      rasconn[0].dwSize=sizeof(RASCONN);
      cb=sizeof(rasconn);

      if(RasEnumConnections(rasconn,&cb,&Connections))
      mb("Failed RasEnumConnections");

      for(DWORD i=0; i < Connections; ++i)
      {
         bConnected=TRUE;
         rasConn.hrasconn=rasconn->hrasconn;

         if(Connections > 1)
         {
            if(!g_szEntryName[0])
            wsprintf(g_szEntryName,"%s\n",rasconn[i].szEntryName);
            else
            lstrcat(g_szEntryName,rasconn[i].szEntryName);
         }
         else
         lstrcpy(g_szEntryName,rasconn[i].szEntryName);
      }
   }

   if(bConnected)
   {
      char svBuffer[2048];
      wsprintf(svBuffer,
      "Активные соединения:\n\n"
      "%s\n\n"
      "Разорвать?",g_szEntryName);

      int idResponse=MessageBox(HWND_DESKTOP,
      svBuffer,GAppname,MB_YESNO | MB_ICONQUESTION |
      MB_SETFOREGROUND | MB_SYSTEMMODAL);
      if(IDYES==idResponse)
      {
         if(RasHangUp(rasConn.hrasconn))
         mb("Failed RasGetConnectStatus");
      }
      return 0;
   }

   /*-------------------------------------------------------
      Создать диалоговое окно в виде списка подключений.
   -------------------------------------------------------*/
   DialogBoxParam(hInstance,
   MAKEINTRESOURCE(IDD_MAIN_DIALOG),
   HWND_DESKTOP,(DLGPROC)WndProc,(LPARAM)NULL);

   if(!g_szEntryName[0]) /* Выход, если не выбрано устройство для подключения. */
   return 0;

   /*-------------------------------------------------------
      Подключение.
   -------------------------------------------------------*/
   char svBuff[256];
   char szIpAddress[32]; // Ras Client IP address.
   char szServerIpAddress[32]; // Ras Server IP address.
   BOOL bPassword;
   HRASCONN hRasConn=NULL;

   while(!bConnected)
   {
      LPRASDIALPARAMS lpRasDialParams=(LPRASDIALPARAMS)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(RASDIALPARAMS));
      if(!lpRasDialParams)
      mb("Failed HeapAlloc");

      lstrcpy(lpRasDialParams->szEntryName,g_szEntryName);
      lpRasDialParams->dwSize=sizeof(RASDIALPARAMS);

      DWORD dwRet=RasGetEntryDialParams(NULL,lpRasDialParams,&bPassword);
      if(dwRet)
      mb("Failed RasGetEntryDialParams");

      dwRet=RasDial(NULL,NULL,lpRasDialParams,0,NULL,&hRasConn);
      if(dwRet)
      mb("Failed RasDial");

      LPRASCONNSTATUS lpRasConnStatus=(LPRASCONNSTATUS)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(RASCONNSTATUS));
      if(!lpRasConnStatus)
      mb("Failed HeapAlloc");

      lpRasConnStatus->dwSize=sizeof(RASCONNSTATUS);

      dwRet=RasGetConnectStatus(hRasConn,lpRasConnStatus);
      if(ERROR_SUCCESS!=dwRet)
      {
         dwRet=RasHangUp(hRasConn);
         if(ERROR_SUCCESS==dwRet)
         mb("Failed RasGetConnectStatus");

         mb("Failed RasHangUp");
      }

      /*if(RASCS_Connected==lpRasConnStatus->rasconnstate)
      {
         wsprintf(svBuff,"Connection estabilished using %s",
         lpRasConnStatus->szDeviceName);
      }*/

      RASPPPIP* lpProjection=(RASPPPIP*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(RASPPPIP));
      if(!lpProjection)
      mb("Failed HeapAlloc");

      cb=sizeof(RASPPPIP);
      lpProjection->dwSize=cb;
      dwRet=RasGetProjectionInfo(hRasConn,RASP_PppIp,lpProjection,&cb);

      if(dwRet)
      {
         if(ERROR_BUFFER_TOO_SMALL==dwRet)
         {
            if(HeapFree(GetProcessHeap(),0,(LPVOID)lpProjection))
            {
               lpProjection=(RASPPPIP*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,cb);
               if(!lpProjection)
               mb("Failed HeapAlloc");
            }
         }
      } // End "if(dwRet)"

      dwRet=RasGetProjectionInfo(hRasConn,RASP_PppIp,lpProjection,&cb);
      if(dwRet)
      mb("Failed RasGetProjectionInfo");
   
      lstrcpy(szIpAddress,lpProjection->szIpAddress);
      lstrcpy(szServerIpAddress,lpProjection->szServerIpAddress);

      // Print out the IP addresses.
      wsprintf(svBuff,
      //"Connection estabilished using: %s\n"
      //"Ras Server IP-address: %s\nClient IP-address: %s\n\nВыйти?",
      "Устройство:\t%s\n\n"
      "IP-адрес сервера:\t%s\n"
      "IP-адрес клиента:\t%s\n\n"
      "Переподключить?",
      lpRasConnStatus->szDeviceName,
      lpProjection->szServerIpAddress,
      lpProjection->szIpAddress);

      int idResponse=MessageBox(HWND_DESKTOP,
      svBuff,GAppname,MB_YESNO | MB_ICONQUESTION |
      MB_SETFOREGROUND | MB_SYSTEMMODAL);
      if(IDNO==idResponse)
      {
         break;
      }

      dwRet=RasHangUp(hRasConn);
      if(dwRet)
      mb("Failed RasHangUp");

      if(!HeapFree(GetProcessHeap(),0,lpProjection))
      mb("Failed HeapFree [lpRasConnStatus]");

      if(!HeapFree(GetProcessHeap(),0,lpRasConnStatus))
      mb("Failed HeapFree [lpRasConnStatus]");

      if(!HeapFree(GetProcessHeap(),0,lpRasDialParams))
      mb("Failed HeapFree [lpRasDialParams]");

      hRasConn=NULL;

   } // End "while"

   return 0;
}

void mb(char* s)
{
   UINT uType=MB_OK | MB_ICONINFORMATION |
   MB_SETFOREGROUND | MB_SYSTEMMODAL;
   int n=0;
   if(strstr(s,"Failed") || strstr(s,"Error"))
   ++n;

   if(n) {
      uType &=~MB_ICONINFORMATION;
      uType |=MB_ICONWARNING;
   } MessageBox(GetActiveWindow(),s,GAppname,uType);

   if(n)
   ExitProcess(n);
}

BOOL GetOs()
{
   BOOL bRet=FALSE;
   OSVERSIONINFO vi;
   vi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
   GetVersionEx(&vi);
   if(vi.dwPlatformId==VER_PLATFORM_WIN32_NT)
   bRet=TRUE;

   return bRet;
}

BOOL OnInitDialog(HWND hWnd)
{
   SetWindowText(hWnd,GAppname);
   HICON Icon=LoadIcon(GetModuleHandle(NULL),MAKEINTRESOURCE(IDR_MAINFRAME));
   if(!Icon) Icon=LoadIcon(GetModuleHandle(NULL),IDI_APPLICATION);
   SendMessage(hWnd,WM_SETICON,ICON_BIG,(LPARAM)Icon);

   /*-------------------------------------------------------
      Set font.
   -------------------------------------------------------*/
   int FontSize=21;
   HFONT hFont=CreateFont(FontSize,0,0,0,FW_NORMAL,0,0,0,GetACP(),0,0,0,0,"Tahoma");
   SendDlgItemMessage(hWnd,IDC_ST_INFO,WM_SETFONT,(WPARAM)hFont,0);
   SendDlgItemMessage(hWnd,IDC_LIST1,WM_SETFONT,(WPARAM)hFont,0);

   /*-------------------------------------------------------
      Clear ListBox.
   -------------------------------------------------------*/
   SendDlgItemMessage(hWnd,IDC_LIST1,LB_RESETCONTENT,0,0);

   /*-------------------------------------------------------
      Add list box pppoe-devices.
   -------------------------------------------------------*/
   RASENTRYNAME rasentryname[40];
   RASENTRY rasentry;
   DWORD cb, Entries;
   cb=sizeof(rasentryname);
   rasentryname[0].dwSize=sizeof(RASENTRYNAME);

   if(!RasEnumEntries(NULL,NULL,rasentryname,&cb,&Entries))
   {
      for(DWORD i=0; i < Entries; ++i)
      {
         memset(&rasentry,0,sizeof(RASENTRY));
         rasentry.dwSize=sizeof(RASENTRY);

         if(!RasGetEntryProperties(NULL,rasentryname[i].szEntryName,&rasentry,&rasentry.dwSize,NULL,NULL))
         {
            if(0==lstrcmpi("pppoe",rasentry.szDeviceType))
            SendDlgItemMessage(hWnd,IDC_LIST1,LB_ADDSTRING,0,(LPARAM)rasentryname[i].szEntryName);
         }

      } // End "for"
   } // End "if(!RasEnumEntries)"

   /*-------------------------------------------------------
      Установить диалоговое окно в центре
      "Рабочего стола". Размер окна не изменяется.
   -------------------------------------------------------*/
   RECT rect;
   GetWindowRect(hWnd,&rect);
   int nWidth=rect.right;
   int nHeight=rect.bottom;
   SetWindowPos(hWnd,NULL,
   ((GetSystemMetrics(SM_CXSCREEN)-nWidth)/2),
   ((GetSystemMetrics(SM_CYSCREEN)-nHeight)/2),
   nWidth,nHeight,SWP_NOSIZE | SWP_NOZORDER);

   return TRUE;
}

BOOL OnCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
   int wID=LOWORD(wParam); /* Item, control or accelerator identifier. */
   int wNotifyCode=HIWORD(wParam); /* Notification code. */
   HWND hwndCtl=(HWND)lParam; /* Handle of control. */

   switch(wID)
   {
      case IDOK:
      {
         HWND hwndList=GetDlgItem(hWnd,IDC_LIST1);
         int i=(int)SendMessage(hwndList,LB_GETCOUNT,0,0);
         if(LB_ERR==i)
         mb("Failed LB_GETCOUNT");
         else if(!i)
         mb("Выберите подключение.");
         else
         {
            i=SendMessage(hwndList,LB_GETCURSEL,0,0);
            if(LB_ERR==i)
            mb("Выберите подключение.");
            else
            {
               SendDlgItemMessage(hWnd,IDC_LIST1,LB_GETTEXT,(WPARAM)i,(LPARAM)(LPCTSTR)g_szEntryName);
               EndDialog(hWnd,IDOK);
            }
         }

      } // End "IDOK"
      break;

      case IDCANCEL:
      EndDialog(hWnd,IDCANCEL);
      break;

      case IDC_LIST1:
      {
         switch(wNotifyCode)
         {
            case LBN_DBLCLK:
            {
               int nItem=SendMessage(hwndCtl,LB_GETCURSEL,0,0);
               if(LB_ERR!=nItem)
               {
                  SendMessage(hwndCtl,LB_GETTEXT,(WPARAM)nItem,(LPARAM)(LPCTSTR)g_szEntryName);
                  //PostMessage(GetDlgItem(hWnd,IDC_BT_START),BM_CLICK,0,0);
                  EndDialog(hWnd,IDOK);
               }
            }
            break;

         } // End "switch(wNotifyCode)"
      } // End "IDC_LIST1"
      //break;

   } // End wId

   return TRUE;
}

UINT OnCtlColor(HDC hDC, HWND hWnd)
{
   //DWORD Black=RGB(0,0,0);
   //DWORD Green=RGB(0,128,0);
   //DWORD Brown=RGB(128,0,0);

   COLORREF crFont, crBkg;
   crFont=RGB(0,0,0); /* Color black. */
   crBkg=GetSysColor(COLOR_BTNFACE);

   if(IDC_LIST1==GetDlgCtrlID(hWnd)) /* Это ListBox? */
   {
      SetTextColor(hDC,crFont);
      SetBkColor(hDC,crBkg);
      HBRUSH Brush=CreateSolidBrush(crBkg);
      return (UINT)(Brush);
   }
   /*else
   {
      SetTextColor(hDC,GetSysColor(COLOR_WINDOWTEXT));
      SetBkMode(hDC,TRANSPARENT);
      //SetBkColor(hDC,GetSysColor(COLOR_BTNFACE));
   }*/

   SetTextColor(hDC,GetSysColor(COLOR_WINDOWTEXT));
   SetBkMode(hDC,TRANSPARENT);
   HBRUSH Brush=CreateSolidBrush(GetSysColor(COLOR_BTNFACE));
   return (UINT)(Brush);
}

BOOL CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
   switch(uMsg)
   {
      case WM_INITDIALOG:
      if(-1==OnInitDialog(hWnd))
      SendMessage(hWnd,WM_CLOSE,0,0);
      break;

      case WM_COMMAND:
      return OnCommand(hWnd,wParam,lParam);

      case WM_CTLCOLORLISTBOX:
      case WM_CTLCOLORDLG:
      case WM_CTLCOLOREDIT:
      return OnCtlColor((HDC)(wParam),(HWND)(lParam));

      case WM_CLOSE:
      g_szEntryName[0]=0;
      EndDialog(hWnd,IDCANCEL);
      return TRUE;

      case WM_DESTROY:
      return TRUE;

   } // End "uMsg"

   return FALSE;
}

В пакете и скомпилированный файл (т.е. программа) не только исходный код.
Собрать можно как Borland C++ так и Visual Studio (начиная с 6.0).
Вложения
RasConnect.zip
(37.42 Кб) Скачиваний: 989
Последний раз редактировалось rvg 30 сен 2023, 08:44, всего редактировалось 2 раз(а).
Аватара пользователя
rvg
Мастер Даунгрейда
 
Сообщения: 661
Зарегистрирован: 18 июл 2023, 14:12

Re: Полезные исходники для Windows

Сообщение rvg » 25 сен 2023, 10:51

Вот так выглядит
Вложения
RasConnect1.jpg
RasConnect1.jpg (44.79 Кб) Просмотров: 33273
Аватара пользователя
rvg
Мастер Даунгрейда
 
Сообщения: 661
Зарегистрирован: 18 июл 2023, 14:12

Re: Полезные исходники для Windows

Сообщение longhorn_gnu » 25 сен 2023, 11:51

del
Последний раз редактировалось longhorn_gnu 25 сен 2023, 15:21, всего редактировалось 1 раз.
its end?
Аватара пользователя
longhorn_gnu
Мастер Даунгрейда
 
Сообщения: 774
Зарегистрирован: 05 июн 2023, 08:32
Откуда: telegram: @sdl_sdl_sdl_ps_dpl
Железо: deleted

Re: Полезные исходники для Windows

Сообщение rvg » 25 сен 2023, 11:57

longhorn_gnu, мне жаль, но не будет программы. Объяснений что и почему - тоже. Политика Олд-Дос не позволяет. Не будем обсуждать.
(Просьба почистить тему)
Аватара пользователя
rvg
Мастер Даунгрейда
 
Сообщения: 661
Зарегистрирован: 18 июл 2023, 14:12

PlayAvi - Программа проигрывает файл AVI

Сообщение rvg » 25 сен 2023, 13:12

Программа проигрывает файл AVI.
В пакете видео из игры Carmageddon (часть вторая) Splat Pack.
Файлы хранятся в каталоге: % Игра % \DATA\CUTSCENE
Файлы в формате SMK. Преобразовать в AVI позволяет
программа RadVideo.exe скачать можно отсюда:
http://web.archive.org/web/201001021329 ... DTools.exe
(С архивной версии из-за того, что в современной отключена возможность
преобразования)
Установите программу. Запустите RadVideo, выберите файл
Mix_intr.smk, чтобы преобразовать в AVI, выбрать "Convert A Video".
Я отредактировал ролик. Вырезал с помощью VirtualDub логотип и окончание.

Собрать можно как с помощью Borland C++, так и Visual Studio (архив большой из-за AVI-шки 320x200 10 секунд - неупакован кодеком 42 Mb!).
 Развернуть: Play_Avi.cpp
Код: Выделить всё
//  PlayAvi.cpp

#ifdef _MSC_VER >= 1200
// MSVC++
#pragma comment(lib,"vfw32.lib")
#endif

#include <windows.h>
#include <vfw.h>

char* GAppname="PlayAvi";
char* GFilename="MaxDamage.avi";

typedef HWND(VFWAPIV* MCIWNDCREATE)(HWND,HINSTANCE,DWORD,LPCSTR);
MCIWNDCREATE pMCIWndCreate;
HINSTANCE g_hMsvfw32;

void warn(char* x)
{MessageBox(GetActiveWindow(),
x,GAppname,MB_OK | MB_ICONWARNING |
MB_SETFOREGROUND | MB_SYSTEMMODAL);}

BOOL CheckFileExists(char* Filename)
{
   WIN32_FIND_DATA FindFile;
   HANDLE handle=FindFirstFile(Filename,&FindFile);
   if(INVALID_HANDLE_VALUE==handle)
   return FALSE;
   FindClose(handle);
   return TRUE;
}

char* appGetMciErrorString(DWORD Error)
{
   static char Msg[1024];
   *Msg=0;
   mciGetErrorString(Error,Msg,1024);
   if(strchr(Msg,'\r')) *strchr(Msg,'\r')=0;
   if(strchr(Msg,'\n')) *strchr(Msg,'\n')=0;
   return Msg;
}

const void appGetMciError(DWORD Error, char* Str=NULL)
{
   char Msg[2048];
   if(Str)
   {
      wsprintf(Msg,"%s\nmciGetErrorString : %d\n%s",Str,Error,
      appGetMciErrorString(Error));
   }
   else
   {
      wsprintf(Msg,"mciGetErrorString : %d\n%s",Error,
      appGetMciErrorString(Error));
   }

   MessageBox(GetActiveWindow(),Msg,"MciError",
   MB_OK | MB_ICONWARNING | MB_SETFOREGROUND | MB_SYSTEMMODAL);
}

void KillDynamicLibraries()
{
   if(g_hMsvfw32)
   {
      FreeLibrary(g_hMsvfw32);
      g_hMsvfw32=NULL;
   }
}

BOOL InitDynamicLibraries()
{
   BOOL Result=-1;
   g_hMsvfw32=LoadLibrary("msvfw32.dll");
   if(g_hMsvfw32)
   {
      ++Result;

      pMCIWndCreate=(MCIWNDCREATE)GetProcAddress(
      g_hMsvfw32,"MCIWndCreateA");
      if(pMCIWndCreate)
      ++Result;
   }
   return Result;
}

//
// Entry point
//
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
   if(!CheckFileExists(GFilename))
   {
      char Buffer[512];
      wsprintf(Buffer,"Failed missing file\n\n\"%s\"",GFilename);
      warn(Buffer);
      return 1;
   }

   if(1>InitDynamicLibraries())
   {
      warn("Cannot InitDynamicLibraries");
      KillDynamicLibraries();
      return 1;
   }

   char Filename[MAX_PATH];
   GetShortPathName(GFilename,Filename,259);
   if(!Filename[0])
   {
      warn("Cannot make short path");
      KillDynamicLibraries();
      return 1;
   }

   DWORD dwStyle=WS_POPUP | WS_VISIBLE | WS_MAXIMIZE |
   WS_THICKFRAME | WS_EX_TOPMOST | WS_EX_TRANSPARENT |
   MCIWNDF_NOOPEN |
   MCIWNDF_NOMENU |
   MCIWNDF_NOPLAYBAR |
   MCIWNDF_NOTIFYMODE |
   MCIWNDF_NOERRORDLG;

   HWND hWnd=HWND_DESKTOP;

   HWND hwndMCI=MCIWndCreate(hWnd,
   GetModuleHandle(NULL),dwStyle,GFilename);
   if(!hwndMCI)
   {
      warn("Failed MCIWndCreate");
      return 1;
   }

   SendMessage(hwndMCI,MCIWNDM_SETZOOM,0,(LPARAM)(UINT)400);

   MCIERROR mErr=SendMessage(hwndMCI,MCI_PLAY,0,0);
   if(mErr)
   {
      appGetMciError(mErr,"play");
      DestroyWindow(hwndMCI);
      KillDynamicLibraries();
      return 1;
   }

   ShowCursor(FALSE);

   MSG msg;
   static char ptr[3];

   while(!GetAsyncKeyState(VK_END) && !GetAsyncKeyState(VK_ESCAPE))
   {
      if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
      {
         TranslateMessage(&msg);     
         DispatchMessage(&msg);
      }
      else
      {
         long lMode=MCIWndGetMode(hwndMCI,ptr,sizeof(ptr));
         if(MCI_MODE_STOP==lMode || MCI_MODE_NOT_READY==lMode)
         break;
      }
   }

   ShowCursor(TRUE);

   KillDynamicLibraries();

   return (int)msg.wParam;
}
Вложения
PlayAvi.zip
(6.14 Мб) Скачиваний: 1140
Последний раз редактировалось rvg 25 сен 2023, 13:16, всего редактировалось 1 раз.
Аватара пользователя
rvg
Мастер Даунгрейда
 
Сообщения: 661
Зарегистрирован: 18 июл 2023, 14:12

Re: Полезные исходники для Windows

Сообщение krotan » 25 сен 2023, 15:14

rvg писал(а):Программа проигрывает файл AVI
Какие кодеки и разрешения экрана поддерживаются?
Аватара пользователя
krotan
Мастер Даунгрейда
 
Сообщения: 325
Зарегистрирован: 03 фев 2022, 20:16
Железо: EeePC

Re: Полезные исходники для Windows

Сообщение rvg » 25 сен 2023, 16:25

krotan писал(а):Какие кодеки и разрешения экрана поддерживаются?

Что в операционной системе имеется - это по-кодекам. Формат, также зависит от видеодаптера. Программа просто "крутит" средствами Api.
Я почему оставил неупакованным AVI? Потому что взять к примеру XVid, он сейчас в всеми знакомом "K-Lite Codec Pack" не идет. Лишь в версии 2.8.5.0 имеется (подсказка это брать на Archive.org). Ну вы поняли. Всё от компьютера зависит воспроизводит кино - будет крутить.
Аватара пользователя
rvg
Мастер Даунгрейда
 
Сообщения: 661
Зарегистрирован: 18 июл 2023, 14:12

PView95 - программа для Windows 9x.

Сообщение rvg » 25 сен 2023, 16:38

PView95 - программа для Windows 9x.
Аналог Диспетчера Задач современных ОС (в некотором роде).
Эта программа из пакета программ примеров Borland C++ (5.02)
меня не устраивал размер окон, что я и изменил.
Собрать можно с помощью Borland C++ и Visual Studio.
Модулей несколько. Поэтому всё в пакете.
Вот так выглядит (снимок с двухядерного Asus, видеоадаптер в процессоре драйверов нет (наверное), я вчера собирался видео как бы записать и перенес
систему с одного на другой, но Windows 98 на Asus никогда не запускал)
Кому интересно вот такой компьютер P5GC-MX/1333, 4 Гб RAM -
отредактирован System.ini ссекция [386Enh] параметр MaxPhysPage=30000
Нормально работает!
Вложения
PView95_1.jpg
PView95_1.jpg (57.47 Кб) Просмотров: 32867
Pview95.zip
(72.12 Кб) Скачиваний: 972
Аватара пользователя
rvg
Мастер Даунгрейда
 
Сообщения: 661
Зарегистрирован: 18 июл 2023, 14:12

Re: Полезные исходники для Windows

Сообщение krotan » 25 сен 2023, 17:29

rvg писал(а):Потому что взять к примеру XVid, он сейчас...
Для того, чтобы проигрывать видео, упакованное кодеком XviD совсем не обязательно устанавливать этот кодек. Любой кодек стандарта mpeg4 способен проигрывать видео, запакованное другим кодеком mpeg4... в том числе XviD, DivX и Mpeg4 от Microsoft...
Аватара пользователя
krotan
Мастер Даунгрейда
 
Сообщения: 325
Зарегистрирован: 03 фев 2022, 20:16
Железо: EeePC

След.

Вернуться в Программирование

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2