· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Шаблон ScreenSaver

Посл.отвђт Сообщенiе


Дата: Дек 23, 2003 16:46:07

	.686
	.MMX
	.XMM	
	.MODEL FLAT, STDCALL			
	OPTION CASEMAP:none

	INCLUDE		windows.inc
	INCLUDE		kernel32.inc
	INCLUDE		user32.inc
	INCLUDE		gdi32.inc
	INCLUDE		opengl32.inc
	INCLUDE		scrnsave.inc             
             
	INCLUDELIB	kernel32.lib
	INCLUDELIB	user32.lib
	INCLUDELIB	gdi32.lib
	INCLUDELIB	scrnsave.lib
             
             
	INCLUDELIB	kernel32.lib
	INCLUDELIB	user32.lib
	INCLUDELIB	gdi32.lib
	INCLUDELIB	opengl32.lib
	INCLUDELIB	glu32.lib
	INCLUDELIB	scrnsave.lib

Start:
ScreenSaverProc proc EXPORT hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
	invoke	DefScreenSaverProc, hWnd, uMsg, wParam, lParam
    	ret
ScreenSaverProc endp

ScreenSaverConfigureDialog	proc hWnd:DWORD, Msg:DWORD,wParam:DWORD, lParam:DWORD
	xor	eax,eax
	ret
ScreenSaverConfigureDialog	endp

end Start



Что то неверно? При запуске простит библиотеку scrnsave.dll
Насколько я понимаю, модуль scrnsave.lib реализует DefScreenSaverProc - обработка завершающих событий, и анализ командной строки плюс создание окна с оконной процедурой определенной в коде под именем ScreenSaverProc и установкой родительского окна...
Не получается что то у меня.
Пример на C выглядит так:
/********************************************************************* *******

    PROGRAM: SSAVER.C     

    PURPOSE: A bare bones shell for a Win32 screen saver
 

********************************************************************** ******/

#include <windows.h>            /* required for all Windows applications */
#include <stdlib.h>
#include <scrnsave.h>
#include "resource.h"
#include "doframe.h"

HANDLE hInst;                   /* current instance              */
UINT wTimer = 0;    // Timer id


/*
 * RegisterDialogClasses -- Entry point for registering window classes 
 *                          required by configuration dialog box.
 */
BOOL WINAPI RegisterDialogClasses(HINSTANCE hInst)
{
    return 1;
}


/*
 * ScreenSaverConfigureDialog -- Process the screen saver configuration
 *                               messages for the config dialog
 *
 */
BOOL CALLBACK ScreenSaverConfigureDialog(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
    switch(Msg)
    {
        case WM_COMMAND:
			switch(LOWORD(wParam))
            {
                case IDOK:  // Exit the dialog
                case IDC_EXIT:
					EndDialog(hWnd, 42);
					break;
            }
        break;

        default:
		    return FALSE;
        break;
    }
    return TRUE;
}

				       
/********************************************************************* *******

    FUNCTION: ScreenSaverProc(HWND, UINT, WPARAM, LPARAM)

    PURPOSE:  Processes screen saver messages

********************************************************************** ******/

LONG CALLBACK ScreenSaverProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{                
	switch (msg) {
	case WM_TIMER:
        // Show a frame of our animation
		DrawFrame(hWnd);
		return 0;
	
    case WM_ERASEBKGND:        
		// Seed the random number generator
        srand(GetTickCount());
		
		// Tell windows to send us timer messages at 50ms intervals
        wTimer = SetTimer(hWnd, 0, 50, NULL);  
		break;       

    case WM_DESTROY:            /* message: window being destroyed */
		if (wTimer) // Stop our timer if it was created
			KillTimer(hWnd, wTimer); 
		break;              
    }  
    
    return DefScreenSaverProc(hWnd, msg, wParam, lParam); 
}



Дата: Дек 24, 2003 09:10:17

vyacheslav
Посмотри, в "исходниках" есть какой-то пример скринсейвера.


Дата: Дек 24, 2003 12:35:04 · Поправил: q_q

vyacheslav
Потому что
...
Start:
ScreenSaverProc ...

end Start
Читай теорию Handling Screen Savers


Дата: Дек 24, 2003 15:25:07 · Поправил: vyacheslav


Потому что
...
Start:
ScreenSaverProc ...

end Start


Теорию я читал и не раз, и в том числе указанную ссылку, и писал на C работающие ScreenSaver. Ведь если бы теория была ясна, я бы не задавал вопрос.
разве трудно указать где я ошибаюсь.

Кстити и Start я тоже убрал, тогда при сборке линкер ругается, что нет точки входа.


Дата: Дек 24, 2003 16:17:15

Теорию я читал и не раз ... и писал на C работающие ScreenSaver
Не обижайся.
Дело в том, что Си+scrnsave.lib скрывают от тебя часть работы.

Внутри scrnsave.lib сидят некоторые необходимые для создания хранителя экрана функции. В том числе и WinMain, которая и является, с точки зрения разработчика на Си, стартовой функцией приложения. Поэтому от программиста требуется только реализовать приведенные тобой выше функции.

Конкретно.
Т.е. помимо реализации приведенных тобой asm-функций, твоя задача, как программиста на assemblere, отчасти повторить Си-startup-код, т.е. обеспечить вызов scrnsave.WinMain.


Дата: Дек 24, 2003 18:19:08

vyacheslav
Может быть это чем-нибудь поможет.
Попробуйте либу в аттачменте, в ней, похоже, есть часть кода (dll не просит)
У меня еще просит добавить "INCLUDELIB advapi32.lib"
Но остается 3 unresolved externals:
_RegisterDialogClasses@4 ; это есть в ссылке ^^
__except_handler3 ; возможно не сильно важны, судя по названиям
__except_list ; но можно порыть в какой-то сишной dll

_1057881919__scrnsave.lib


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.082