I think this is the code from the zip. I hope it helps. It is a long time ago and I have not used blitzmax in a while just purebasic.
Strict
Import MaxGui.Drivers
Extern "Win32"
Type T_IplImage
'Field nSize:Int' SizeOf(IplImage)
Field ID:Int ' version (=0)
Field nChannels:Int' ' Most of OpenCV functions support 1,2,3 Or 4 channels
Field alphaChannel:Int'' ignored by OpenCV
Field depth:Int ' pixel depth in bits: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16U,IPL_DEPTH_16S, IPL_DEPTH_32S, IPL_DEPTH_32F And IPL_DEPTH_64F are supported
Field colorModel' ignored by OpenCV
Field channelSeq' ditto
Field dataOrder:Int ' 0 - interleaved color channels, 1 - separate color channels. cvCreateImage can only create interleaved images
Field origin:Int ' 0 - top-Left origin, 1 - bottom-Left origin (Windows bitmaps style)
Field align:Int ' Alignment of image rows (4 Or 8). OpenCV ignores it And uses widthStep instead
Field width:Int ' image width in pixels
Field Height:Int ' image height in pixels
Field _IplROI:Int Ptr ' *roi' image ROI. when it is Not Null, this specifies image region To process
Field _IplImage:Int ' *maskROI' must be Null in OpenCV
Field imageId:Int ' ditto
Field _IplTileInfo:Int ' *tileInfo' ditto
Field imageSize:Int ' image data size in bytes (=image.height * image.widthStep in Case of interleaved data)
Field imageData:Int Ptr ' pointer To aligned image data
Field widthStep:Int ' size of aligned image row in bytes
Field BorderMode' border completion mode, ignored by OpenCV
Field BorderConst' ditto
Field imageDataOrigin:Int Ptr ' pointer To a very origin of image data (Not necessarily aligned) - it is needed For correct image deallocation
End Type
Type CAPDRIVERCAPS
Field wDeviceIndex:Int
Field fHasOverlay:Byte
Field fHasDlgVideoSource:Byte
Field fHasDlgVideoFormat:Byte
Field fHasDlgVideoDisplay:Byte
Field fCaptureInitialized:Byte
Field fDriverSuppliesPalettes:Byte
Field hVideoIn:Int
Field hVideoOut:Int
Field hVideoExtIn:Int
Field hVideoExtOut:Int
End Type
End Extern
'-----
Local TrackerLib = LoadLibraryA("Tracker.dll")
'Local TrackerLib = LoadLibraryA("Tracker.dll")
Global StartCam (CamIndex)
Global StartAviCap (FileName:String)
Global UpdateCam:T_IplImage (need_to_init)
Global EndCam ()
Global AddTrackingPoint( X, Y)
Global GetTrackingPointer:Byte Ptr()
Global GetTrackingCount:Int()
Global ClearTrackingPoints()
Global SetLineDrawMode(LineDrawMode:Int)
Global GetCaptureFileFramePos()
StartCam = GetProcAddress (TrackerLib,"StartCam")
StartAviCap = GetProcAddress (TrackerLib,"StartAviCap")
UpdateCam = GetProcAddress (TrackerLib,"UpdateCam")
EndCam = GetProcAddress (TrackerLib,"EndCam")
AddTrackingPoint= GetProcAddress (TrackerLib,"AddTrackingPoint")
GetTrackingPointer= GetProcAddress (TrackerLib,"GetTrackingPointer")
GetTrackingCount = GetProcAddress (TrackerLib,"GetTrackingCount")
ClearTrackingPoints = GetProcAddress (TrackerLib,"ClearTrackingPoints")
SetLineDrawMode = GetProcAddress (TrackerLib,"SetLineDrawMode")
GetCaptureFileFramePos = GetProcAddress (TrackerLib,"GetCaptureFileFramePos")
'
'Local CXCoreLib = LoadLibraryA("libcxcore200.dll")
'
'Global cvCreateImage:T_IplImage(width,Height , depth, channels )
'cvCreateImage = GetProcAddress (CXCoreLib,"cvCreateImage")
'-----
Type T_CvSize
Field width
Field Height
End Type
Type T_Rect
Field X
Field Y
Field width
Field Height
EndType
'-----
'SetGraphicsDriver D3D7Max2DDriver:TD3D7Max2DDriver()
'SetGraphicsDriver D3D9Max2DDriver()
SetGraphicsDriver GLMax2DDriver()
Global CamDispWidth =320
Global CamDispHeight=240
Global CamWidth =640
Global CamHeight=480
Global DispRatioW:Float,DispRatioH:Float
Global Fs:T_CvSize = New T_CvSize
Local HeadFont:TGuiFont = LoadGuiFont("Arial",14)
Global Window:TGadget =CreateWindow("Ziltch Tracker Test",0,0,CamDispWidth+40,CamDispHeight+180)
Global PaintCamButton:TGadget = CreateButton("Ziltch Tracker",10,10,CamDispWidth,30,Window,LABEL_CENTER|BUTTON_PUSH)
SetGadgetFont PaintCamButton,HeadFont
Global CamCanvas:TGadget = CreateCanvas(10,50,CamDispWidth,CamDispHeight,Window,GRAPHICS_BACKBUFFER)
Global ExitButton:TGadget = CreateButton("Exit",CamDispWidth-65,CamDispHeight+60,80,24,Window,BUTTON_PUSH)
Global CamCanvashWnd:Int = QueryGadget(CamCanvas,QUERY_HWND)
SetMinWindowSize( Window,64,64 )
SetGadgetLayout(PaintCamButton,EDGE_RELATIVE,EDGE_RELATIVE,EDGE_ALIGNED,0)
SetGadgetLayout(CamCanvas,EDGE_RELATIVE,EDGE_RELATIVE,EDGE_ALIGNED,EDGE_RELATIVE)
SetGadgetLayout(ExitButton,0,EDGE_ALIGNED,0,EDGE_ALIGNED)
'-----
Global G:TGraphics=CanvasGraphics(CamCanvas)
SetGraphics G
Local DisplayCam = True ,NeedToInit
Global FrameTimer:TTimer,UpdateTimer:TTimer
Local WebCamInit,TrackingPointCount=1 ,tp:Byte Ptr
Local Gadget:tgadget,EvData , EvSource:TGadget
Local Frame:T_IplImage
Local Pixmap:TPixmap
Local Pixmap2:TPixmap
Local TrackPointsBank:TBank
Local Count,tx,ty,mX,mY
Local LineDrawMode
Global CameraID= 1
Const FrameSpeed = 5, UpdateSpeed = 10
UpdateTimer= CreateTimer( UpdateSpeed)
FrameTimer= CreateTimer( FrameSpeed)
EnablePolledInput()
StartCam(CameraID)
While WaitEvent()
Gadget:tgadget = TGadget(EventSource())
EvData = EventData()
Select EventID()
Case EVENT_TIMERTICK
Select TTimer(EventSource())
Case UpdateTimer
'Debuglog "UpdateCam"
Frame:T_IplImage = UpdateCam (0)
DebugLog "CaptureFileFramePos "+GetCaptureFileFramePos()
Case FrameTimer
If Frame = Null Then
DebugLog "Frame capture Error"
'FrameProcesing = False
Continue
EndIf
'DebugLog "FrameA "+FrameA
DispRatioW:Float = Frame.width/Float(CamDispWidth )
DispRatioH:Float = Frame.Height / Float(CamDispHeight )
If DisplayCam Then
'DebugLog "Frame.imageData = "+Int( Frame.imageData)
Pixmap:TPixmap = Null
If LineDrawMode Then
Pixmap:TPixmap = CreateStaticPixmap( Frame.imageData,Frame.width,Frame.Height ,Frame.widthStep,PF_I8)
ElseIf Pixmap=Null 'or
' DebugLog "Make Pixmap"
Pixmap:TPixmap = CreateStaticPixmap( Frame.imageData,Frame.width,Frame.Height ,Frame.widthStep,PF_BGR888)
'Pixmap:Tpixmap = CreatePixmap(Frame.width,Frame.Height,PF_BGR888 ,Frame.widthStep)
EndIf
' Pixmap = YFlipPixmap(Pixmap)
If CamDispWidth<> Frame.width Or CamDispHeight <>Frame.Height
Pixmap2:TPixmap = ResizePixmap ( Pixmap,CamDispWidth,CamDispHeight )
'cls
DrawPixmap( Pixmap2,0,0)
Else
DrawPixmap( Pixmap,0,0)
EndIf
' DrawPixmap( Pixmap,0,0)
' Drawoval (10,10,5,5)
'DebugLog "-------------------------------- "
Else
Cls
EndIf
' If KeyHit(KEY_SPACE)
' ClearTrackingPoints()
' DebugLog "ClearTrackingPoints 1"
' EndIf
TrackingPointCount=GetTrackingCount()
' DebugLog "TrackingPointCount = " +TrackingPointCount
If TrackingPointCount
tp = GetTrackingPointer()
If tp Then
' DebugLog " tp = "+Int(tp)
Local TrackingPointCount2 = TrackingPointCount*2-2
TrackPointsBank:TBank = CreateStaticBank( tp,TrackingPointCount2*4+8 )
For Count = 0 To TrackingPointCount2 Step 2
SetColor(255,50,50)
tx:Int = PeekFloat(TrackPointsBank,Count*4)/DispRatioW
' ty:Int = (Frame.Height - PeekFloat(TrackPointsBank,Count*4+4))/DispRatioH
ty:Int = (PeekFloat(TrackPointsBank,Count*4+4))/DispRatioH
' DebugLog Count+" peek tp = "+tx+" , "+ty
' DrawOval(tx-3,ty,8,2)
DrawRect(tx-1,ty-1,2,2)
Next
EndIf
EndIf
Flip
ActivateGadget( CamCanvas)
EndSelect
Case EVENT_KEYDOWN
Select EvData
Case KEY_SPACE
ClearTrackingPoints()
TrackingPointCount=GetTrackingCount()
' DebugLog "ClearTrackingPoints 2"
Case KEY_ENTER
LineDrawMode= Not LineDrawMode
SetLineDrawMode(LineDrawMode)
Case KEY_ESCAPE
DebugLog "exit"
' If FullScreen Then
' ' DoFullScreen(False)
' Else
Exit
'EndIf
End Select
Case EVENT_MOUSEDOWN
Select EvData
Case 1
mX:Int = MouseX()
mY:Int = MouseY()
'AddTrackingPoint( mX*DispRatioW, (CamDispHeight-mY)*DispRatioH)
AddTrackingPoint( mX*DispRatioW, mY*DispRatioH)
Frame:T_IplImage = UpdateCam (0)
' DebugLog "TrackingPointCount="+GetTrackingCount()
' DebugLog "mouse "+mX+ ","+mY + " Frame = "+Frame.width+" , "+Frame.Height+ " DispRatio = "+DispRatioW+" , "+DispRatioH
Case 2
' For mX = 40 To Frame.width-80 Step 80
' For mY = Frame.Height-80 To 80 Step -80
' AddTrackingPoint( mX*2, mY)
' 'Delay 10
' Frame:T_IplImage = UpdateCam ()
' Next
' Next
ClearTrackingPoints()
Frame:T_IplImage = UpdateCam (1)
DebugLog "FindGoodFeaturesToTrack TrackingPointCount="+GetTrackingCount()
'TrackingPointCount=GetTrackingCount()
Case 3
DisplayCam = Not DisplayCam
EndSelect
Case EVENT_WINDOWSIZE
Select Gadget
Case Window
CamDispWidth = GadgetWidth(Window)-30
CamDispHeight = GadgetHeight(Window)-170
FreeGadget(CamCanvas)
CamCanvas = CreateCanvas(10,50,CamDispWidth,CamDispHeight,Window,GRAPHICS_BACKBUFFER)
'CamCanvashWnd= QueryGadget(CamCanvas,BBQID_WIN32HWND)
G=CanvasGraphics(CamCanvas)
SetGraphics G
' Frame:T_IplImage = UpdateCam (1)
SetGadgetLayout(CamCanvas,EDGE_RELATIVE,EDGE_RELATIVE,EDGE_ALIGNED,EDGE_RELATIVE)
'DebugLog "CamDisp "+CamDispWidth+ ","+CamDispHeight + " Frame = "+Frame.width+" , "+Frame.Height
Cls
Frame:T_IplImage = UpdateCam (0)
Pixmap:TPixmap = CreateStaticPixmap( Frame.imageData,Frame.width,Frame.Height ,Frame.widthStep,PF_I8)
DispRatioW:Float =Frame.width/Float(CamDispWidth )
DispRatioH:Float = Frame.Height / Float(CamDispHeight )
EndSelect
Case EVENT_GADGETACTION
Select Gadget
Case ExitButton
Exit
EndSelect
Case EVENT_APPTERMINATE
Exit
Case EVENT_WINDOWCLOSE
EvSource:TGadget = TGadget(EventSource())
Select EvSource
Case Window
Exit
EndSelect
EndSelect
Wend
EndCam ()
Tracker.dll c code
//ziltch tracking.dll using opencv 2.3rc
#include "dll.h"
#include "E:\Dev-Cpp\include\windows.h"
#include "E:\Dev-Cpp\include\stdio.h"
#include "E:\Dev-Cpp\include\stdlib.h"
#ifdef _CH_
#pragma package <opencv>
#endif
#include "E:\OpenCV2-3rc\include\opencv\cv.h"
#include "E:\OpenCV2-3rc\include\opencv\highgui.h"
IplImage* frame = 0;
IplImage *image = 0,*image2 = 0, *grey = 0, *prev_grey = 0, *pyramid = 0, *prev_pyramid = 0, *swap_temp;
IplImage *edges = 0;
int win_size = 16;
const int MAX_COUNT = 500;
CvPoint2D32f* points[2] = {0,0}, *swap_points;
char* status = 0;
int count = 0 ,PointsTracked =0;
int flags = 0 , linedraw =0;
int add_remove_pt = 0;
CvPoint pt;
CvCapture* capture = 0;
DLLIMPORT CvCapture* GetCaptureHwnd()
{
return capture;
}
DLLIMPORT AddTrackingPoint(int x, int y)
{
pt = cvPoint(x,y);
add_remove_pt = 1;
fprintf(stdout,"Add pt ... %i , %i \n",x,y);
}
DLLIMPORT ClearTrackingPoints()
{
count = 0;
PointsTracked = 0;
}
DLLIMPORT CvPoint2D32f* GetTrackingPointer()
{
if( count > 0 )
{
return points[0];
}
}
DLLIMPORT int GetTrackingCount()
{
return PointsTracked;
}
DLLIMPORT int SetLineDrawMode(int LineDrawMode)
{
linedraw = LineDrawMode;
return linedraw;
}
DLLIMPORT int GetCaptureFileFramePos()
{
return cvGetCaptureProperty(capture,CV_CAP_PROP_POS_FRAMES);
}
DLLIMPORT int SetCaptureFileFramePos(int Pos)
{
return cvSetCaptureProperty(capture,CV_CAP_PROP_POS_FRAMES,Pos);
}
DLLIMPORT int GetCaptureFileFrameCount()
{
return cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_COUNT);
}
DLLIMPORT int GetCaptureFileFramePosMsec()
{
return cvGetCaptureProperty(capture,CV_CAP_PROP_POS_MSEC);
}
DLLIMPORT double GetCaptureFilePosRatio() // 0.0 is start 1.0 is end.
{
return cvGetCaptureProperty(capture,CV_CAP_PROP_POS_AVI_RATIO);
}
DLLIMPORT int GetCaptureFileFPS()
{
return cvGetCaptureProperty(capture,CV_CAP_PROP_FPS);
}
DLLIMPORT int GetCaptureFileFOURCC() // Video file codec type
{
return cvGetCaptureProperty(capture,CV_CAP_PROP_FOURCC);
}
DLLIMPORT int GetCaptureFileFrameWidth()
{
return cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_WIDTH);
}
DLLIMPORT int GetCaptureFileFrameHeight()
{
return cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_HEIGHT);
}
/* These functions currently do not work in OpenCv
DLLIMPORT int GetCamBrightness()
{
return cvGetCaptureProperty(capture,CV_CAP_PROP_BRIGHTNESS);
}
DLLIMPORT int GetCamContrast()
{
return cvGetCaptureProperty(capture,CV_CAP_PROP_CONTRAST);
}
DLLIMPORT int GetCamSaturation()
{
return cvGetCaptureProperty(capture,CV_CAP_PROP_SATURATION);
}
DLLIMPORT int GetCamHue()
{
return cvGetCaptureProperty(capture,CV_CAP_PROP_HUE);
}
DLLIMPORT int GetCamGain()
{
return cvGetCaptureProperty(capture,CV_CAP_PROP_GAIN);
}
DLLIMPORT int GetCamExposure()
{
return cvGetCaptureProperty(capture,CV_CAP_PROP_EXPOSURE);
}
DLLIMPORT int SetCamBrightness(double value)
{
return cvSetCaptureProperty(capture,CV_CAP_PROP_BRIGHTNESS,value);
}
DLLIMPORT int SetCamContrast(double value)
{
return cvSetCaptureProperty(capture,CV_CAP_PROP_CONTRAST,value);
}
DLLIMPORT int SetCamSaturation(double value)
{
return cvSetCaptureProperty(capture,CV_CAP_PROP_SATURATION,value);
}
DLLIMPORT int SetCamHue(double value)
{
return cvSetCaptureProperty(capture,CV_CAP_PROP_HUE,value);
}
DLLIMPORT int SetCamGain(double value)
{
return cvSetCaptureProperty(capture,CV_CAP_PROP_GAIN,value);
}
DLLIMPORT int SetCamExposure(double value)
{
return cvSetCaptureProperty(capture,CV_CAP_PROP_EXPOSURE,value);
}
*/
DLLIMPORT void FreeCamImage()
{
image =0 ;
}
DLLIMPORT void EndCam ()
{
// MessageBox (0, "StartCam\n", "Starting Camera", MB_ICONINFORMATION);
cvReleaseCapture( &capture );
capture = 0;
image =0 ;
// cvDestroyWindow("TRacker");
}
DLLIMPORT StartCam (int CamIndex)
{
// fprintf(stdout,"Starting Camera %i \n",CamIndex);
capture = cvCreateCameraCapture(CamIndex);// cvCaptureFromCAM(-1);
// MessageBox (0, "StartCam\n", "Start Camera", MB_ICONINFORMATION);
if( !capture )
{
fprintf(stderr,"Could not initialize capturing...\n");
return -1;
}
}
DLLIMPORT StartAviCap (char** Filename)
{
fprintf(stdout,"Starting tracking Filename %s \n",Filename);
capture = cvCaptureFromFile( Filename );
// MessageBox (0, "cvCaptureFromAVI\n", "Start cvCaptureFromAVI", MB_ICONINFORMATION);
if( !capture )
{
fprintf(stderr,"Could not initialize capturing...\n");
return -1;
}
}
DLLIMPORT IplImage* UpdateCam (int FindGoodFeaturesToTrack)
{
int i, k, c;
// MessageBox (0, "cvQueryFrame \n", "Update Camera", MB_ICONINFORMATION);
frame = cvQueryFrame( capture );
// fprintf(stdout,"Get Frame %i image %i\n",frame,image);
if( !frame )
{
// MessageBox (0, "cvQueryFrame FAILED\n", "Update Camera", MB_ICONINFORMATION);
return;
}
if( !image )
{
// fprintf(stdout,"make image files IplImage ... %i \n",frame);
//MessageBox (0, "Setup image structs \n", "Setup", MB_ICONINFORMATION);
/* allocate all the buffers */
image = cvCreateImage( cvGetSize(frame), 8, 3 );
image->origin = frame->origin;
image2 = cvCreateImage( cvGetSize(frame), IPL_DEPTH_16S, 1);
grey = cvCreateImage( cvGetSize(frame), 8, 1 );
edges = cvCreateImage( cvGetSize(frame), 8, 1 );
prev_grey = cvCreateImage( cvGetSize(frame), 8, 1 );
pyramid = cvCreateImage( cvGetSize(frame), 8, 1 );
prev_pyramid = cvCreateImage( cvGetSize(frame), 8, 1 );
//MessageBox (0, "Alloc arrays \n", "Setup", MB_ICONINFORMATION);
points[0] = (CvPoint2D32f*)cvAlloc(MAX_COUNT*sizeof(points[0][0]));
points[1] = (CvPoint2D32f*)cvAlloc(MAX_COUNT*sizeof(points[0][0]));
status = (char*)cvAlloc(MAX_COUNT);
flags = 0;
}
//MessageBox (0, "Copy frame to image \n", "copy", MB_ICONINFORMATION);
cvCopy( frame, image, 0 );
//MessageBox (0, "Copied frame to image \n", "copied", MB_ICONINFORMATION);
cvCvtColor( image, grey, CV_RGB2GRAY ); //CV_BGR2GRAY
//MessageBox (0, "cvCvtColor image \n", "copied", MB_ICONINFORMATION);
// fprintf(stdout,"Got Frame %i \n",frame);
if( FindGoodFeaturesToTrack )
{
/* automatic initialization */
// fprintf(stdout,"FindGoodFeaturesToTrack ... %i \n",FindGoodFeaturesToTrack);
IplImage* eig = cvCreateImage( cvGetSize(grey), 32, 1 );
IplImage* temp = cvCreateImage( cvGetSize(grey), 32, 1 );
double quality = 0.01;
double min_distance = 10;
count = MAX_COUNT;
cvGoodFeaturesToTrack( grey, eig, temp, points[1], &count,
quality, min_distance, 0, 3, 0, 0.04 );
cvFindCornerSubPix( grey, points[1], count,
cvSize(win_size,win_size), cvSize(-1,-1),
cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS,20,0.03));
cvReleaseImage( &eig );
cvReleaseImage( &temp );
add_remove_pt = 0;
}
else if( count > 0 )
{
// MessageBox (0, "cvCalcOpticalFlowPyrLK \n", "cvCalcOpticalFlowPyrLK", MB_ICONINFORMATION);
cvCalcOpticalFlowPyrLK( prev_grey, grey, prev_pyramid, pyramid,
points[0], points[1], count, cvSize(win_size,win_size), 2, status, 0,
cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS,20,0.03), flags );
// flags |= CV_LKFLOW_PYR_A_READY;
for( i = k = 0; i < count; i++ )
{
if( add_remove_pt )
{
double dx = pt.x - points[1][i].x;
double dy = pt.y - points[1][i].y;
if( dx*dx + dy*dy <= 25 )
{
// fprintf(stdout," **>> dx*dx + dy*dy <= 25 ... %i \n",dx*dx + dy*dy);
add_remove_pt = 0;
continue;
}
}
if( !status[i] )
continue;
points[1][k++] = points[1][i];
// cvCircle( image, cvPointFrom32f(points[1][i]), 3, CV_RGB(0,255,0), -1, 8,0);
// fprintf(stdout,"point ... %d , %d \n",cvPointFrom32f(points[1][i]).x,cvPointFrom32f(points[1][i]).y);
}
// cvCircle( image, pt, 3, CV_RGB(255,255,0), -1, 8,0);
count = k;
PointsTracked = k;
// fprintf(stdout,"PointsTracked ... %i \n",PointsTracked);
}
if (add_remove_pt && count < MAX_COUNT )
{
// MessageBox (0, "add point \n", "Setup", MB_ICONINFORMATION);
points[1][count++] = cvPointTo32f(pt);
cvFindCornerSubPix( grey, points[1] + count - 1, 1,
cvSize(win_size,win_size), cvSize(-1,-1),
cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS,20,0.03));
add_remove_pt = 0;
}
CV_SWAP( prev_grey, grey, swap_temp );
CV_SWAP( prev_pyramid, pyramid, swap_temp );
CV_SWAP( points[0], points[1], swap_points );
// FindGoodFeaturesToTrack = 0;
if (linedraw)
{
if (linedraw ==1)
{
cvCanny( grey, edges, 30,100, 3 );
// cvCvtColor( image, grey, CV_GRAY2BGR );
return edges;
}
else if (linedraw ==2)
{
cvLaplace(grey, image2,5);
cvConvertScale( image2, grey, 1, 0);
return grey;
//cvSmooth(grey, grey, CV_GAUSSIAN, 5, 0, 0,0);
}
}
// MessageBox (0, "return imaget \n", "finish", MB_ICONINFORMATION);
return image;
// cvShowImage( "TRacker", image );
}
BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ ,
DWORD reason /* Reason this function is being called. */ ,
LPVOID reserved /* Not used. */ )
{
switch (reason)
{
case DLL_PROCESS_ATTACH:
break;
case DLL_PROCESS_DETACH:
EndCam ();
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
/* Returns TRUE on success, FALSE on failure */
return TRUE;
}
|