Пример DLL
Программа, рисующая снеговика, содержит функции рисования сферы, диска и цилиндра. Упакуем эти функции в динамическую библиотеку, причем возмем как функции рисования как сплошных, так и проволочных объектов. Основной файл obj3d.asm:
.386
.model flat, stdcall
option casemap :none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\gdi32.inc
include \masm32\include\opengl32.inc
include \masm32\include\glu32.inc
include \masm32\include\masm32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\gdi32.lib
includelib \masm32\lib\opengl32.lib
includelib \masm32\lib\glu32.lib
includelib \masm32\lib\masm32.lib
SolidSphere PROTO :DWORD,:DWORD,:DWORD,:DWORD
WireSphere PROTO :DWORD,:DWORD,:DWORD,:DWORD
SolidDisk PROTO :DWORD,:DWORD,:DWORD,:DWORD
WireDisk PROTO :DWORD,:DWORD,:DWORD,:DWORD
SolidCylinder PROTO :DWORD,:DWORD,:DWORD,:DWORD
WireCylinder PROTO :DWORD,:DWORD,:DWORD,:DWORD
.code
; #########################################################################
LibMain proc
ret
LibMain Endp
; #########################################################################
SolidSphere PROC ListNumber:DWORD,Color:DWORD,Radius:DWORD,Parts:DWORD
LOCAL hSphere:DWORD
invoke glNewList,ListNumber,GL_COMPILE_AND_EXECUTE
invoke gluNewQuadric
mov hSphere,eax
invoke gluQuadricDrawStyle,hSphere,GL_FILL
invoke gluQuadricNormals,hSphere,GL_SMOOTH
invoke glColor3fv,Color
mov eax,Radius
invoke gluSphere,hSphere,[eax],[eax+4],Parts,Parts
invoke glEndList
mov eax,hSphere
ret
SolidSphere ENDP
; #########################################################################
WireSphere PROC ListNumber:DWORD,Color:DWORD,Radius:DWORD,Parts:DWORD
LOCAL hSphere:DWORD
invoke glNewList,ListNumber,GL_COMPILE_AND_EXECUTE
invoke gluNewQuadric
mov hSphere,eax
invoke gluQuadricDrawStyle,hSphere,GLU_LINE
invoke gluQuadricNormals,hSphere,GL_SMOOTH
invoke glColor3fv,Color
mov eax,Radius
invoke gluSphere,hSphere,[eax],[eax+4],Parts,Parts
invoke glEndList
mov eax,hSphere
ret
WireSphere ENDP
; #########################################################################
SolidDisk PROC ListNumber:DWORD,Color:DWORD,Radius:DWORD,Parts:DWORD
LOCAL hDisk:DWORD
invoke glNewList,ListNumber,GL_COMPILE_AND_EXECUTE
invoke gluNewQuadric
mov hDisk,eax
invoke gluQuadricDrawStyle,hDisk,GLU_FILL
invoke gluQuadricNormals,hDisk,GL_SMOOTH
invoke glColor3fv,Color
mov eax,Radius
invoke gluDisk,hDisk,[eax],[eax+4],[eax+8],[eax+12],Parts,Parts
invoke glEndList
mov eax,hDisk
ret
SolidDisk ENDP
; #########################################################################
WireDisk PROC ListNumber:DWORD,Color:DWORD,Radius:DWORD,Parts:DWORD
LOCAL hDisk:DWORD
invoke glNewList,ListNumber,GL_COMPILE_AND_EXECUTE
invoke gluNewQuadric
mov hDisk,eax
invoke gluQuadricDrawStyle,hDisk,GLU_LINE
invoke gluQuadricNormals,hDisk,GL_SMOOTH
invoke glColor3fv,Color
mov eax,Radius
invoke gluDisk,hDisk,[eax],[eax+4],[eax+8],[eax+12],Parts,Parts
invoke glEndList
mov eax,hDisk
ret
WireDisk ENDP
; #########################################################################
SolidCylinder PROC ListNumber:DWORD,Color:DWORD,Radius:DWORD,Parts:DWORD
LOCAL hCylinder:DWORD
invoke glNewList,ListNumber,GL_COMPILE_AND_EXECUTE
invoke gluNewQuadric
mov hCylinder,eax
invoke gluQuadricDrawStyle,hCylinder,GLU_FILL
invoke gluQuadricNormals,hCylinder,GL_SMOOTH
invoke glColor3fv,Color
mov eax,Radius
invoke gluCylinder,hCylinder,[eax],[eax+4],[eax+8],[eax+12],[eax+16],[eax+20],Parts,Parts
invoke glEndList
mov eax,hCylinder
ret
SolidCylinder ENDP
; #########################################################################
WireCylinder PROC ListNumber:DWORD,Color:DWORD,Radius:DWORD,Parts:DWORD
LOCAL hCylinder:DWORD
invoke glNewList,ListNumber,GL_COMPILE_AND_EXECUTE
invoke gluNewQuadric
mov hCylinder,eax
invoke gluQuadricDrawStyle,hCylinder,GLU_LINE
invoke gluQuadricNormals,hCylinder,GL_SMOOTH
invoke glColor3fv,Color
mov eax,Radius
invoke gluCylinder,hCylinder,[eax],[eax+4],[eax+8],[eax+12],[eax+16],[eax+20],Parts,Parts
invoke glEndList
mov eax,hCylinder
ret
WireCylinder ENDP
; #########################################################################
end LibMain
Файл определений obj3d.def:
LIBRARY obj3d
EXPORTS SolidSphere
EXPORTS WireSphere
EXPORTS SolidDisk
EXPORTS WireDisk
EXPORTS SolidCylinder
EXPORTS WireCylinder
Последний файл - makedll.bat:
@echo off
if exist obj3d.obj del obj3d.obj
if exist obj3d.dll del obj3d.dll
\masm32\bin\ml /c /coff obj3d.asm
\masm32\bin\Link /SUBSYSTEM:WINDOWS /DLL /DEF:obj3d.def obj3d.obj
dir obj3d.*
pause
Все три файла помещаем в отдельную папку и запускаем makedll.bat. В результате компиляции в папке появятся такие файлы: obj3d.obj, obj3d.exp, obj3d.lib и obj3d.dll. Нам понадобятся только два: obj3d.lib и obj3d.dll (остальное - отходы компиляции).
Скачать исходники.