Writing a recognizer: The EZBoot recognizer source code
Introduction
A recognizer, according to original Symbian design, shall be used to identify the MIME type that is attached to a file. This is one of the step involved in writing application that can handle a specific type of data. Check the excellent Nokia's guide for application developer on document handler document located in the Series60Doc directory of your SDK installation.
Recognizers can also be used to autostart an application at mobile boot. However, an error in a recognizer can prevent the mobile boot and force you to bring the device back to your local Nokia customer service for a complete reflash (this is only true if you work on C: drive).
Below is the code that I used for the EZBoot application [1]. The code itself is rather self-explanatory. So I won't detail it more.
Note that the value 0x101Fxxxx appears in the .h and in the .mmp file and shall be replace by a UID you get from Symbian.
This code is here for educational purpose. I suggest that if you intend to do use it to boot your application, you use the EZBoot binary instead (to avoid the multiplication of dummy recognizer).
Header
//
// EZ-Boot
//
//////////////////////////////////////////////////////////////////////////////
// Boot & Recognizer Module
// by NewLC (http://www.newlc.com)
//////////////////////////////////////////////////////////////////////////////
// File : ezrecog.h
// Compatibility: Symbian OS v6.1
// History:
// 2003.07.26: EBS : Creation
// 2003.08.12: EBS : Integration in EZBoot
// 2003.09.01: EBS : Add boot file recognition
// 2003.10.28: EBS : Cleanup and comment
//////////////////////////////////////////////////////////////////////////////
#include <apmrec.h> // CApaDataREcognizerType
#define KUidRecog 0x1xxxxxxx // Use your own value here !!!
class CRecog : public CApaDataRecognizerType
{
public:
CRecog();
TUint PreferredBufSize();
TDataType SupportedDataTypeL(TInt aIndex) const;
static void BootUp();
static TInt BootUpKick(TAny *aParam);
static void BootUpKickL();
private:
void DoRecognizeL(const TDesC& aName, const TDesC8& aBuffer);
TBool HeaderRecognized(const TDesC8& aBuf);
TBool NameRecognized(const TDesC& aName);
};
Implementation
//
// EZ-Boot
//
//////////////////////////////////////////////////////////////////////////////
// Boot & Recognizer Module
// by NewLC (http://www.newlc.com)
//////////////////////////////////////////////////////////////////////////////
// File : ezrecog.cpp
// Compatibility: Symbian OS v6.1
// History:
// 2003.07.26: EBS : Creation
// 2003.08.12: EBS : Integration in EZBoot
// 2003.09.01: EBS : Add boot file recognition
// 2003.10.28: EBS : Cleanup and comment
//////////////////////////////////////////////////////////////////////////////
#include <e32std.h>
#include <e32base.h>
#include <e32def.h>
#include <f32file.h>
#include <apacmdln.h>
#include <apgcli.h>
#include <apmrec.h>
#include <apmstd.h>
#include "ezrecog.h"
//////////////////////////////////////////////////////////////////////////////
//
// Recognition Definitions
//
/////////////////////////////////////////////////////////////////////////////
// The MIME Type that will be recognized
_LIT8(KEzbMimeType,"text/vnd.newlc.ezboot");
// The file extension that shall be used by data we are recognizing
_LIT(KEzbFileExtension,".boot");
// The data header that identifies EZBoot data
_LIT8(KEzbDataHeader,"EZBoot:");
// The priority of the recognizer, can be EHigh, ENormal, ELow
#define KEzRecognizerPriority CApaDataRecognizerType::ENormal
// The size of the data buffer that will be passed to the recognizer
// so that it performs the recognition
#define KEzRecognizerBufferSize 7
// The recognizer UID
const TUid KUidEzBoot={KUidRecog};
//////////////////////////////////////////////////////////////////////////////
//
// Boot Definitions
//
/////////////////////////////////////////////////////////////////////////////
// The application we want to boot (here the EZBoot server)
_LIT(KEzBootExe,"\\system\\programs\\ezboot\\ezbootsrv.exe");
// The thread name that will used to launch the above EXE
_LIT(KBootUpThreadName,"EzBootThr");
//////////////////////////////////////////////////////////////////////////////
/// DLL entry point.
/// \param aReason can be ignored.
/// \return Always KErrNone
/////////////////////////////////////////////////////////////////////////////
GLDEF_C TInt E32Dll(TDllReason /*aReason*/)
{
return(KErrNone);
}
//////////////////////////////////////////////////////////////////////////////
/// Recognizer instanciation. This function MUST be the first one defined
/// for the recognizer.
/// \return a pointer on a new allocated recognizer instance
//////////////////////////////////////////////////////////////////////////////
EXPORT_C CApaDataRecognizerType *CreateRecognizer()
{
// Create a recognizer instance
CApaDataRecognizerType *me = new CRecog();
// Start all the boot code under a trap harness
// This is pure boot code and has (normally) nothing to do
// in a recognizer...
CRecog::BootUp();
return(me);
}
//////////////////////////////////////////////////////////////////////////////
/// Recognizer Constructor.
/// Initialise the internal data member iCountDataTypes with the number of
/// MIME types that will be recognized. Set the recognizer priority.
//////////////////////////////////////////////////////////////////////////////
CRecog::CRecog()
:CApaDataRecognizerType(KUidEzBoot,KEzRecognizerPriority)
{
iCountDataTypes=1;
}
//////////////////////////////////////////////////////////////////////////////
/// Returns the size of the data buffer that will be passed to the recognition
/// function (used by the recognition framework)
/// \see DoRecognizeL()
/// \return size of the data buffer
//////////////////////////////////////////////////////////////////////////////
TUint CRecog::PreferredBufSize()
{
return(KEzRecognizerBufferSize);
}
//////////////////////////////////////////////////////////////////////////////
/// Returns the MIME type that our recognizer is able to manage
/// (used by the recognition framework)
/// \param aIndex: the index of the MIME type to return (will be always 1 for
/// a recognizer that handles a single MIME type)
/// \return a MIME type
//////////////////////////////////////////////////////////////////////////////
TDataType CRecog::SupportedDataTypeL(TInt /*aIndex*/) const
{
return(TDataType(KEzbMimeType));
}
/////////////////////////////////////////////////////////////////////////////
/// The recognition function. The result of the recognition is stored in
/// the iConfidence data member.
/// \param aName: the name of the file that contain the data to analyze
/// \param aBuffer: the data buffer
/// \see PreferredBufSize()
/////////////////////////////////////////////////////////////////////////////
void CRecog::DoRecognizeL(const TDesC& aName, const TDesC8& aBuffer)
{
// Initialise the result status
iConfidence = ENotRecognized;
iDataType = TDataType(KEzbMimeType);
// Check that we got the required amount of data
if(aBuffer.Length()<KEzRecognizerBufferSize)
return;
// Check that the file name corresponds to our criteria
TBool nameOK(EFalse);
nameOK=NameRecognized(aName);
// Check that the data corresponds to our criteria
TBool headerOK(EFalse);
headerOK=HeaderRecognized(aBuffer);
// Conclude:
// - if file name and data are OK then the data are certainly recognized
// - if only the data are recognized, then this is only a possibility
// - else the data have not been recognized
if( nameOK && headerOK)
{
iConfidence=ECertain;
}
else if(!nameOK && headerOK)
{
iConfidence=EPossible;
}
else
return;
}
/////////////////////////////////////////////////////////////////////////////
/// The file name recognition function. This functions checks whether the
/// provided filename matches our criteria (here we want it to have the .boot
/// extension)
/// \param aName: the name to check
/// \return ETrue if the file is OK
/////////////////////////////////////////////////////////////////////////////
TBool CRecog::NameRecognized(const TDesC& aName)
{
TBool res=EFalse;
if(aName.Length()>5)
{
TInt dotPos = aName.LocateReverse( '.' );
if (dotPos != KErrNotFound)
{
TInt extLength = aName.Length() - dotPos;
HBufC* ext = aName.Right( extLength ).AllocL();
CleanupStack::PushL( ext );
if ( ext->CompareF(KEzbFileExtension) == 0 )
{
res = ETrue;
}
CleanupStack::PopAndDestroy(); // ext
}
}
return(res);
}
/////////////////////////////////////////////////////////////////////////////
/// The data recognition function. This functions checks whether the
/// provided data starts with our data header
/// extension
/// \param aBuf: the data buffer to check
/// \return ETrue if the data are OK
/////////////////////////////////////////////////////////////////////////////
TBool CRecog::HeaderRecognized(const TDesC8& aBuf)
{
if(aBuf.Find(KEzbDataHeader)==0)
return ETrue;
return EFalse;
}
/////////////////////////////////////////////////////////////////////////////
/// The Boot code (non leaving). Create a new thread and kicks the real
/// boot code.
/// \see BootUpKick()
/////////////////////////////////////////////////////////////////////////////
void CRecog::BootUp()
{
// Create a new thread
RThread* bootThread = new RThread();
if(bootThread)
{
TInt res=KErrNone;
// and Start it
res=bootThread->Create(KBootUpThreadName,
CRecog::BootUpKick,
KDefaultStackSize,
KMinHeapSize,
KMinHeapSize,
NULL,
EOwnerThread);
if(res==KErrNone)
{
bootThread->Resume();
bootThread->Close();
}
else
{
delete bootThread;
}
}
}
/////////////////////////////////////////////////////////////////////////////
/// The threaded boot code (non leaving). Actually just create a cleanup
/// stack and call a non-leaving implementation of the boot code
/// \see BootUp()
/// \see BootUpKickL()
/// \param aParam: not used but required as a thread entry point
/// \return thread result
/////////////////////////////////////////////////////////////////////////////
TInt CRecog::BootUpKick(TAny* /*aParam*/)
{
TInt err=KErrNoMemory;
// Create a cleanup stack...
CTrapCleanup *cleanup=CTrapCleanup::New();
if(cleanup)
{
//... and Kick under a trap harness
TRAP(err,CRecog::BootUpKickL());
delete cleanup;
}
return err;
}
/////////////////////////////////////////////////////////////////////////////
/// The Boot code.
/////////////////////////////////////////////////////////////////////////////
void CRecog::BootUpKickL()
{
// Get the full path (including drive letter)
// to the boot server
RFs fs;
User::LeaveIfError(fs.Connect());
CleanupClosePushL(fs);
TFindFile findFile(fs);
User::LeaveIfError(findFile.FindByDir(KEzBootExe,KNullDesC));
// Connect to the Apparc server
// and start our server
RApaLsSession ls;
User::LeaveIfError(ls.Connect());
CleanupClosePushL(ls);
CApaCommandLine *cmd = CApaCommandLine::NewLC();
cmd->SetLibraryNameL(findFile.File());
cmd->SetCommandL(EApaCommandOpen);
User::LeaveIfError(ls.StartApp(*cmd));
// Delete all stuff on the cleanup stack
CleanupStack::PopAndDestroy(3);
}
MMP File
TARGETTYPE mdl
TARGETPATH \system\recogs
UID 0x10003A19 0x101Fxxxx
USERINCLUDE ..\inc
SYSTEMINCLUDE \epoc32\include
SOURCEPATH ..\src
SOURCE ezrecog.cpp
LIBRARY euser.lib
LIBRARY apmime.lib apparc.lib apgrfx.lib
LIBRARY efsrv.lib
[1] This is not exactly the code that has been used in the current EZBoot package but a cleaner one, and the one of the next release






> Writing a recognizer: The EZBoot recognizer source code
> Writing a recognizer: The EZBoot recognizer source code
> Writing a recognizer: The EZBoot recognizer source code
people said that long journey must start with first step. Here I am now, on the first step to develop C++ Symbian application --> I just compile and run HelloWorldPlus example application from my SDK. can I run HelloWorldPlus application (basic APP) to run by this ezBoot ?
I think I should create helloworldplus.boot, your tutorial on using ezboot.sis said that. so, I create helloworldplus.boot, contain only one line: boot:\system\apps\HelloWorldPlus\HelloWorldPlus.app
I put this boot file on C:\Symbian\7.0s\Series60_v21\Epoc32\release\wins\udeb\z\system\programs\ezboot\helloworldplus.boot
in ezrecog.cpp, I change path of application to boot: _LIT(KEzBootExe,"\\system\\programs\\ezboot\\helloworldplus.boot");
I think, my HelloWorldPlus application will take over the screen of my emulator, right after I started it. I have 'abld build wins udeb' sucessfully, but nothing happen. Would you tell me what's wrong? Do I miss something ?
thanks for help
> Writing a recognizer: The EZBoot recognizer source code
The code which manage boot files is not included here. You should the full EzBoot to use boot files and applications.
Alternatively, you have to edit the code above: find KEzBootExe declaration and replace the value it contains by the name of your server (This second solution probably won't work in your case as you are trying to boot an APP: I don't know what will happen in that case. Maybe a simple panic or maybe this will lock your phone - so don't work on C: drive).
Re: > Writing a recognizer: The EZBoot recognizer source code
please immediately mention about about writing ezrecog.lib file as I have asked you previously. Once again I thank you for the code given.
shravan_vip
Re: > Writing a recognizer: The EZBoot recognizer source code
Your question has been answered (see below): you must create a MDL file, not a DLL thuis there is no lib file to handle. Read the documentation about recognizer. Now, if you go your own way, nobody can help you if you don't publish your code (please do this in the forum not here).
Re: > Writing a recognizer: The EZBoot recognizer source code
sir,
After following the procedure mentioned and writing the code. After compling it is not running on emulator. some times it was showing link error and lib file missing. please rectify it
where I went wrong?
Re: > Writing a recognizer: The EZBoot recognizer source code
Can u please help me in step by step procedure of " Autostarting an application"
My code is follows
#include
#include
#include "QuickStart.h"
//#include "C:\CWEx\ActiveObjs\ActiveDll\ActiveDll.h"
const TUid KUidemAMRec={0x0EBC2E40};
CMyRecognizer::CMyRecognizer()
:CApaDataRecognizerType(KUidemAMRec, CApaDataRecognizerType::ENormal)
{
iCountDataTypes = 1;
}
TUint CMyRecognizer::PreferredBufSize()
{
// no buffer recognition yet
return 0;
}
TDataType CMyRecognizer::SupportedDataTypeL(TInt /*aIndex*/) const
{
return TDataType();
}
void CMyRecognizer::DoRecognizeL(const TDesC& /*aName*/, const TDesC8&
/*aBuffer*/)
{
// this function is never called
}
void CMyRecognizer::StartThread()
{
TInt res = KErrNone;
//create a new thread for starting our application
RThread * startAppThread;
startAppThread = new RThread();
User::LeaveIfError( res = startAppThread->Create(
_L("MyThreadName"),
CMyRecognizer::StartAppThreadFunction,
KDefaultStackSize,
KMinHeapSize,
KMinHeapSize,
NULL,
EOwnerThread) );
startAppThread->SetPriority(EPriorityNormal/*EPriorityLess*/);
startAppThread->Resume();
startAppThread->Close();
}
TInt CMyRecognizer::StartAppThreadFunction(TAny* /*aParam*/)
{
/*
//wait 5 seconds...
RTimer timer; // The asynchronous timer and ...
TRequestStatus timerStatus; // ... its associated request status
timer.CreateLocal(); // Always created for this thread.
// get current time (microseconds since 0AD nominal Gregorian)
TTime time;
time.HomeTime();
// add ten seconds to the time
TTimeIntervalSeconds timeIntervalSeconds(50);
time += timeIntervalSeconds;
// issue and wait
timer.At(timerStatus,time);
User::WaitForRequest(timerStatus);
*/
CActiveScheduler * scheduler = new CActiveScheduler();
if( scheduler == NULL )
return KErrNoMemory;
CActiveScheduler::Install(scheduler);
// create a TRAP cleanup
CTrapCleanup * cleanup = CTrapCleanup::New();
TInt err;
if( cleanup == NULL )
{
err = KErrNoMemory;
}
else
{
TRAP( err, StartAppThreadFunctionL() );
}
delete cleanup;
delete CActiveScheduler::Current();
return err;
}//StartAppThreadFunction
void CMyRecognizer::StartAppThreadFunctionL()
{
/* CActiveDll* iActiveDll;
iActiveDll = CActiveDll::NewLC();
iActiveDll->ShowMessage();*/
TFileName fnAppPath = _L("E:\\system\\Apps\\AppUidViewer\\AppUidViewer.app");
RFs fsSession; //file server session
User::LeaveIfError(fsSession.Connect());
CleanupClosePushL(fsSession);
TFindFile findFile( fsSession );
User::LeaveIfError( findFile.FindByDir(fnAppPath, KNullDesC) );
CApaCommandLine* cmdLine = CApaCommandLine::NewLC();
cmdLine->SetLibraryNameL( findFile.File() );
cmdLine->SetCommandL( EApaCommandOpen );
RApaLsSession ls;
User::LeaveIfError(ls.Connect());
CleanupClosePushL(ls);
User::LeaveIfError( ls.StartApp(*cmdLine) );
CleanupStack::PopAndDestroy(3); // Destroy fsSession, ls and cmdLine
}//StartAppThreadFunctionL
EXPORT_C CApaDataRecognizerType* CreateRecognizer()
{
CApaDataRecognizerType* thing = new CMyRecognizer();
//start thread for our application
CMyRecognizer::StartThread();
return thing;
}
// DLL entry point
GLDEF_C TInt E32Dll(TDllReason /*aReason*/)
{
return KErrNone;
}
As you have said I have downloaded and installed the ezboot.sis into my N72 phone. Please explain me the remaining steps.
Iam getting canfused as to How to create .boot file and .mdl and their targets. Please explain me briefly. Whether it works on N72.
Re: Writing a recognizer: The EZBoot recognizer source code
I have executed the same by following each and every step of the procedure which you have posted. Please give me details about the library file ezrecog.lib.I mean where to write and what to write in ezrecog.lib.
After executing following errors are in major as follows: Total 3 errors other than warnings
tool exit status == 1
Errors caused tool to abort.
Link Error : Undefined symbol: 'int E32Dll(enum TDllReason) (?E32Dll@@YAHW4TDllReason@@@Z)'
referenced from 'int _E32Dll(void *, unsigned int, void *) (?_E32Dll@@YGHPAXI0@Z)' in up_dll.cpp:159 (EDLL.LIB)
referenced from 'int _E32Dll(void *, unsigned int, void *) (?_E32Dll@@YGHPAXI0@Z)' in up_dll.cpp:162 (EDLL.LIB)
referenced from 'int _E32Dll(void *, unsigned int, void *) (?_E32Dll@@YGHPAXI0@Z)' in up_dll.cpp:165 (EDLL.LIB)
referenced from 'int _E32Dll(void *, unsigned int, void *) (?_E32Dll@@YGHPAXI0@Z)' in up_dll.cpp:168 (EDLL.LIB)
Could Not Find C:\symbiantraining\ezrecog\group\ezrecog_Data\WINSCW_UDEB\EZRECOG.APP
tool exit status == 1
Errors caused tool to abort.
# Specified file 'C:\symbiantraining\ezrecog\group\ezrecog_Data\WINSCW_UDEB\EZRECOG.lib' not found
tool exit status == 2
Link Error : MAKEDEF ERROR: C:\symbiantraining\ezrecog\group\ezrecog_Data\WINSCW_UDEB\EZRECOG.inf: Inffile not found
Could Not Find C:\symbiantraining\ezrecog\group\ezrecog_Data\WINSCW_UDEB\EZRECOG.inf
Could Not Find C:\symbiantraining\ezrecog\group\ezrecog_Data\WINSCW_UDEB\EZRECOG.lib
tool exit status == 1
Errors caused tool to abort.
tool exit status == 1
Errors caused tool to abort.
Link Error : Undefined symbol: 'int E32Dll(enum TDllReason) (?E32Dll@@YAHW4TDllReason@@@Z)'
referenced from 'int _E32Dll(void *, unsigned int, void *) (?_E32Dll@@YGHPAXI0@Z)' in up_dll.cpp:159 (EDLL.LIB)
referenced from 'int _E32Dll(void *, unsigned int, void *) (?_E32Dll@@YGHPAXI0@Z)' in up_dll.cpp:162 (EDLL.LIB)
referenced from 'int _E32Dll(void *, unsigned int, void *) (?_E32Dll@@YGHPAXI0@Z)' in up_dll.cpp:165 (EDLL.LIB)
referenced from 'int _E32Dll(void *, unsigned int, void *) (?_E32Dll@@YGHPAXI0@Z)' in up_dll.cpp:168 (EDLL.LIB)
Could Not Find C:\symbiantraining\ezrecog\group\ezrecog_Data\WINSCW_UDEB\EZRECOG.APP
tool exit status == 1
Errors caused tool to abort.
# Specified file 'C:\symbiantraining\ezrecog\group\ezrecog_Data\WINSCW_UDEB\EZRECOG.lib' not found
tool exit status == 2
Link Error : MAKEDEF ERROR: C:\symbiantraining\ezrecog\group\ezrecog_Data\WINSCW_UDEB\EZRECOG.inf: Inffile not found
Could Not Find C:\symbiantraining\ezrecog\group\ezrecog_Data\WINSCW_UDEB\EZRECOG.inf
Could Not Find C:\symbiantraining\ezrecog\group\ezrecog_Data\WINSCW_UDEB\EZRECOG.lib
tool exit status == 1
Errors caused tool to abort.
tool exit status == 1
Errors caused tool to abort.
Link Error : Undefined symbol: 'int E32Dll(enum TDllReason) (?E32Dll@@YAHW4TDllReason@@@Z)'
referenced from 'int _E32Dll(void *, unsigned int, void *) (?_E32Dll@@YGHPAXI0@Z)' in up_dll.cpp:159 (EDLL.LIB)
referenced from 'int _E32Dll(void *, unsigned int, void *) (?_E32Dll@@YGHPAXI0@Z)' in up_dll.cpp:162 (EDLL.LIB)
referenced from 'int _E32Dll(void *, unsigned int, void *) (?_E32Dll@@YGHPAXI0@Z)' in up_dll.cpp:165 (EDLL.LIB)
referenced from 'int _E32Dll(void *, unsigned int, void *) (?_E32Dll@@YGHPAXI0@Z)' in up_dll.cpp:168 (EDLL.LIB)
Could Not Find C:\symbiantraining\ezrecog\group\ezrecog_Data\WINSCW_UDEB\EZRECOG.APP
tool exit status == 1
Errors caused tool to abort.
# Specified file 'C:\symbiantraining\ezrecog\group\ezrecog_Data\WINSCW_UDEB\EZRECOG.lib' not found
tool exit status == 2
Link Error : MAKEDEF ERROR: C:\symbiantraining\ezrecog\group\ezrecog_Data\WINSCW_UDEB\EZRECOG.inf: Inffile not found
Could Not Find C:\symbiantraining\ezrecog\group\ezrecog_Data\WINSCW_UDEB\EZRECOG.inf
Could Not Find C:\symbiantraining\ezrecog\group\ezrecog_Data\WINSCW_UDEB\EZRECOG.lib
tool exit status == 1
Errors caused tool to abort.
Link Error : Undefined symbol: 'int E32Dll(enum TDllReason) (?E32Dll@@YAHW4TDllReason@@@Z)'
referenced from 'int _E32Dll(void *, unsigned int, void *) (?_E32Dll@@YGHPAXI0@Z)' in up_dll.cpp:159 (EDLL.LIB)
referenced from 'int _E32Dll(void *, unsigned int, void *) (?_E32Dll@@YGHPAXI0@Z)' in up_dll.cpp:162 (EDLL.LIB)
referenced from 'int _E32Dll(void *, unsigned int, void *) (?_E32Dll@@YGHPAXI0@Z)' in up_dll.cpp:165 (EDLL.LIB)
referenced from 'int _E32Dll(void *, unsigned int, void *) (?_E32Dll@@YGHPAXI0@Z)' in up_dll.cpp:168 (EDLL.LIB)
Link Error : Undefined symbol: 'int E32Dll(enum TDllReason) (?E32Dll@@YAHW4TDllReason@@@Z)'
referenced from 'int _E32Dll(void *, unsigned int, void *) (?_E32Dll@@YGHPAXI0@Z)' in up_dll.cpp:159 (EDLL.LIB)
referenced from 'int _E32Dll(void *, unsigned int, void *) (?_E32Dll@@YGHPAXI0@Z)' in up_dll.cpp:162 (EDLL.LIB)
referenced from 'int _E32Dll(void *, unsigned int, void *) (?_E32Dll@@YGHPAXI0@Z)' in up_dll.cpp:165 (EDLL.LIB)
referenced from 'int _E32Dll(void *, unsigned int, void *) (?_E32Dll@@YGHPAXI0@Z)' in up_dll.cpp:168 (EDLL.LIB)
Link Error : Undefined symbol: 'int E32Dll(enum TDllReason) (?E32Dll@@YAHW4TDllReason@@@Z)'
referenced from 'int _E32Dll(void *, unsigned int, void *) (?_E32Dll@@YGHPAXI0@Z)' in up_dll.cpp:159 (EDLL.LIB)
referenced from 'int _E32Dll(void *, unsigned int, void *) (?_E32Dll@@YGHPAXI0@Z)' in up_dll.cpp:162 (EDLL.LIB)
referenced from 'int _E32Dll(void *, unsigned int, void *) (?_E32Dll@@YGHPAXI0@Z)' in up_dll.cpp:165 (EDLL.LIB)
referenced from 'int _E32Dll(void *, unsigned int, void *) (?_E32Dll@@YGHPAXI0@Z)' in up_dll.cpp:168 (EDLL.LIB)
pls reply me back soon.
Thanking You
srk2007
Re: Writing a recognizer: The EZBoot recognizer source code
please mention about ezrecogAppview.cpp also. Is there any changes to be done to view.cpp
Re: Writing a recognizer: The EZBoot recognizer source code
You MUST create a MDL target, not a DLL.
Re: Writing a recognizer: The EZBoot recognizer source code
How to create and where to place erecog.lib , erecog.app ,erecog.inf . what to write in erecog.lib ?