I have created an Apache module mod_Agent,There is an Registered and defined optional function in my module abc(); ,i want to retrieve that optional in my windows application, for that i included,"mod_Agent header" in my application, also in Properties, C/C++->General provided path of that module it compiled fine,but when i am trying retrieve the optional function it is giving me Compiler error: "Error 1 error LNK2019: unresolved external symbol _imp_apr_dynamic_fn_retrieve" for this i tried giving Linker->input "path of mod_Agent.lib",but still it is giving same error.
i think some other thing needs to be given in properties or else,kindly help me is resolving this.
This is my Application.c code
#pragma comment(lib,"mod_AgentConfiguration.lib")
#include "AgentConfig.h"
typedef int (__cdecl *MYPROC)(char *,Agent *);
static APR_OPTIONAL_FN_TYPE(LoadAgentConfiguration) *pfn;
int main( void )
{
Agent *Agents;
int iReturnVal;
HINSTANCE hinstLib;
MYPROC ProcAdd;
BOOL fFreeResult, fRunTimeLinkSuccess = FALSE;
char *Filename = "D:\\Agentconfiguration.xml";
Agents = (Agent *)malloc (sizeof(Agent));
memset( Agents, 0, sizeof(Agent));
pfn = APR_RETRIEVE_OPTIONAL_FN(LoadAgentConfiguration);
iReturnVal = pfn(Filename, Agents);
hinstLib = LoadLibrary(TEXT("Evtreader.dll"));
if (hinstLib != NULL)
{
ProcAdd = (MYPROC) GetProcAddress(hinstLib, "InitializeEventReader");
if (NULL != ProcAdd)
{
fRunTimeLinkSuccess = TRUE;
(ProcAdd) (Filename,Agents);
}
ProcAdd = (MYPROC) GetProcAddress(hinstLib, "CollectEvent");
if (NULL != ProcAdd)
{
fRunTimeLinkSuccess = TRUE;
}
fFreeResult = FreeLibrary(hinstLib);
}
if (! fRunTimeLinkSuccess)
printf("Message printed from executable\n");
return 0;
}
Mod_agent.h
#pragma comment(lib,"mod_AgentConfiguration.lib")
#include "AgentConfig.h"
typedef int (__cdecl *MYPROC)(char *,Agent *);
static APR_OPTIONAL_FN_TYPE(LoadAgentConfiguration) *pfn;
int main( void )
{
Agent *Agents;
int iReturnVal;
HINSTANCE hinstLib;
MYPROC ProcAdd;
BOOL fFreeResult, fRunTimeLinkSuccess = FALSE;
char *Filename = "D:\\Agentconfiguration.xml";
Agents = (Agent *)malloc (sizeof(Agent));
memset( Agents, 0, sizeof(Agent));
pfn = APR_RETRIEVE_OPTIONAL_FN(LoadAgentConfiguration);
iReturnVal = pfn(Filename, Agents);
hinstLib = LoadLibrary(TEXT("Evtreader.dll"));
if (hinstLib != NULL)
{
ProcAdd = (MYPROC) GetProcAddress(hinstLib, "InitializeEventReader");
if (NULL != ProcAdd)
{
fRunTimeLinkSuccess = TRUE;
(ProcAdd) (Filename,Agents);
}
ProcAdd = (MYPROC) GetProcAddress(hinstLib, "CollectEvent");
if (NULL != ProcAdd)
{
fRunTimeLinkSuccess = TRUE;
}
fFreeResult = FreeLibrary(hinstLib);
}
if (! fRunTimeLinkSuccess)
printf("Message printed from executable\n");
return 0;
}
<pre lang="c++">
#include "AgentConfig.h"
Agent * AgentConfigObj;
char ParentName[100];
char CtConnectID[100];
Connector *CtConnector;
int CtReaderType;
int CtQueueType;
int CtCommChaType;
void AgentConfigStore(const char *TagName, const char *TagValue)
{
if (!strcmp(TagName,"AgentDisplayName"))
strcpy(AgentConfigObj->AgentDisplayName, TagValue);
if (!strcmp(TagName,"AgentDescription"))
strcpy(AgentConfigObj->AgentDescription,TagValue);
if (!strcmp(TagName,"AgentVersion"))
AgentConfigObj->AgentVersion = atoi(TagValue);
if (!strcmp(TagName,"OSName"))
strcpy(AgentConfigObj->OSName,TagValue);
if (!strcmp(TagName,"OSVersion"))
AgentConfigObj->OSVersion = atoi(TagValue);
if (!strcmp(TagName,"AgentGroup"))
strcpy(AgentConfigObj->AgentGroup,TagValue);
if (!strcmp(TagName,"HardwareType"))
strcpy(AgentConfigObj->HardwareType,TagValue);
}
void InitializeConnector(apr_xml_attr* ConnAttr)
{
char NewConnectorID[100] = {0};
Connector *NewConnector = 0;
while(1)
{
if(ConnAttr->next == NULL || !strcmp(ConnAttr->name, "id"))
{
strcpy( NewConnectorID, ConnAttr->value);
break;
}
ConnAttr = ConnAttr->next;
}
if(strcmp(NewConnectorID, CtConnectID) != 0)
{
strcpy(CtConnectID, NewConnectorID);
NewConnector = (Connector *) malloc (sizeof(Connector));
memset( NewConnector, 0, sizeof(Connector));
if(AgentConfigObj->Connectors == NULL)
{
NewConnector->Next = NULL;
NewConnector->Prev = NULL;
CtConnector = NewConnector;
AgentConfigObj->Connectors = CtConnector;
}
else
{
CtConnector->Next = NewConnector;
NewConnector->Prev = CtConnector;
CtConnector = NewConnector;
}
}
}
void Agent_ReturnTag(apr_xml_elem *e)
{
apr_xml_elem *ec;
if ( e->first_cdata.first && e->first_cdata.first->text )
{
apr_text *next = e->first_cdata.first;
apr_xml_attr *tagattr = e->attr;
if (!strcmp(e->name, "Agent") || !strcmp(e->name, "Reader") ||
!strcmp(e->name, "Queue") || !strcmp(e->name, "CommunicationChannel") ||
!strcmp(e->name, "Filters"))
{
strcpy(ParentName, e->name);
if (!strcmp(e->name, "Reader"))
{
CtReaderType = GetReaderType(e);
InitializeReader(CtConnector, CtReaderType);
}
if (!strcmp(e->name, "Queue"))
{
CtQueueType = GetQueueType(e);
InitializeQueue(CtConnector, CtQueueType);
}
if (!strcmp(e->name, "CommunicationChannel"))
{
CtCommChaType = GetCommChannelType(e);
InitializeCommChannnel(CtConnector, CtCommChaType);
}
}
else if (!(strcmp(e->name,"connector")))
{
InitializeConnector(tagattr);
}
else
{
if(!strcmp(ParentName, "Agent"))
AgentConfigStore(e->name, next->text);
if(!strcmp(ParentName, "Reader"))
{
switch (CtReaderType)
{
case TXTReaderType:
TXTReaderConfigStore(e->name, next->text, (TXTReader *)CtConnector->Reader);
break;
case EVTReaderType:
EVTReaderConfigStore(e->name, next->text, (EVTReader *)CtConnector->Reader,tagattr);
break;
}
}
}
if (e->first_child)
{
ec = e->first_child;
while (ec)
{
Agent_ReturnTag(ec);
ec = ec->next;
}
}
}
}
void GetAgentConfig(apr_pool_t *pool, char *pFileName)
{
apr_status_t ret;
apr_file_t * fd;
apr_xml_parser * parser;
apr_xml_doc * doc;
apr_size_t size_read = 2000;
ret = apr_file_open(&fd, pFileName, APR_READ, APR_OS_DEFAULT, pool );
ret = apr_xml_parse_file( pool, &parser, &doc, fd, size_read );
if ( ret != APR_SUCCESS )
{
char errbuf[1024] = {0};
apr_xml_parser_geterror( parser, errbuf, sizeof(errbuf));
}
apr_file_close( fd );
Agent_ReturnTag(doc->root);
}
int LoadAgentConfiguration(char *pFileName, Agent *OutAgentConfigObj)
{
apr_pool_t *pool;
apr_status_t ret;
AgentConfigObj = OutAgentConfigObj;
ret = apr_initialize();
if ( ret != APR_SUCCESS)
printf( "apr_initialize() failed (%d)\n", ret );
ret = apr_pool_create(&pool, NULL);
if ( ret != APR_SUCCESS)
printf( "apr_pool_create() failed %d\n", ret );
GetAgentConfig(pool, pFileName);
apr_pool_destroy( pool );
return APR_SUCCESS;
}
static void InitAgentConfig_Hooks(apr_pool_t *pool)
{
APR_REGISTER_OPTIONAL_FN(LoadAgentConfiguration);
}
module AP_MODULE_DECLARE_DATA AgentConfig_modules = {
STANDARD20_MODULE_STUFF,
NULL,
NULL,
NULL,
NULL,
NULL,
InitAgentConfig_Hooks
} ;
//Reader.c
#include "AgentConfig.h"
LogRegisteredEvents *EntryRegisteredEvent;
int GetReaderType(apr_xml_elem *e)
{
apr_xml_elem *ec = e;
int RType = RTUnKnown;
apr_text *next = ec->first_cdata.first;
ec = e->first_child->first_child;
while (ec)
{
apr_text *next = ec->first_cdata.first;
if(!strcmp(ec->name, "Type"))
{
if(!strcmp(next->text, "TxtReader"))
RType = TXTReaderType;
RType = XMLReaderType;
else if(!strcmp(next->text, "EVTReader"))
RType = EVTReaderType;
}
ec=ec->next;
}
return RType;
}
void InitializeReader(Connector *Conn, int CtReaderType)
{
switch (CtReaderType)
{
case TXTReaderType:
Conn->Reader = (void *) malloc (sizeof(TXTReader));
memset( Conn->Reader, 0, sizeof(TXTReader));
break;
case EVTReaderType:
Conn->Reader = (void *) malloc (sizeof(EVTReader));
memset( Conn->Reader, 0, sizeof(EVTReader));
break;
}
Conn->ReaderType =CtReaderType;
}
void TXTReaderConfigStore(const char *TagName, const char *TagValue, TXTReader *Reader)
{
if (!strcmp(TagName,"Plug-in") || !strcmp(TagName,"GeneralConfiguration"))
return;
if (!strcmp(TagName,"Provider"))
strcpy(Reader->Provider,TagValue);
if (!strcmp(TagName,"Id"))
Reader->Id = atoi(TagValue);;
if (!strcmp(TagName,"Version"))
strcpy(Reader->Version,TagValue);
if (!strcmp(TagName,"Type"))
strcpy(Reader->Type,TagValue);
if (!strcmp(TagName,"OS"))
strcpy(Reader->OS,TagValue);
if (!strcmp(TagName,"OSVersion"))
strcpy(Reader->OSVersion,TagValue);
if (!strcmp(TagName,"HardwareType"))
strcpy(Reader->HardwareType,TagValue);
if (!strcmp(TagName,"FileName"))
strcpy(Reader->FileName,TagValue);
if (!strcmp(TagName,"FileLocation"))
strcpy(Reader->FileLocation,TagValue);
if (!strcmp(TagName,"MaximumFileSize"))
strcpy(Reader->MaximumFileSize,TagValue);
if (!strcmp(TagName,"RegEx"))
strcpy(Reader->RegEx,TagValue);
if (!strcmp(TagName,"Delimiter"))
strcpy(Reader->Delimiter,TagValue);
if (!strcmp(TagName,"FileShareCredential"))
strcpy(Reader->FileShareCredential,TagValue);
}
void EVTReaderConfigStore(const char *TagName, const char *TagValue, EVTReader *Reader,apr_xml_attr *Rdattr)
{
if (!strcmp(TagName,"Plug-in") || !strcmp(TagName,"GeneralConfiguration"))
return;
if (!strcmp(TagName,"Provider"))
strcpy(Reader->Provider,TagValue);
if (!strcmp(TagName,"Id"))
Reader->Id = atoi(TagValue);;
if (!strcmp(TagName,"Version"))
Reader->Version = atoi(TagValue);
if (!strcmp(TagName,"Type"))
strcpy(Reader->Type,TagValue);
if (!strcmp(TagName,"OS"))
strcpy(Reader->OS,TagValue);
if (!strcmp(TagName,"OSVersion"))
strcpy(Reader->OSVersion,TagValue);
if (!strcmp(TagName,"LogRegisteredEvents"))
{
LogRegisteredEvents *LastRegisteredEvent = 0;
LastRegisteredEvent = (LogRegisteredEvents *) malloc (sizeof(LogRegisteredEvents));
if(Reader->LogRegisteredEvents == NULL)
{
LastRegisteredEvent->Next = NULL;
EntryRegisteredEvent = LastRegisteredEvent;
Reader->LogRegisteredEvents = EntryRegisteredEvent;
}
else
{
EntryRegisteredEvent->Next = LastRegisteredEvent;
EntryRegisteredEvent = LastRegisteredEvent;
}
while(1)
{
if(Rdattr->next == NULL || !strcmp(Rdattr->name, "id"))
{
EntryRegisteredEvent->id = atoi(Rdattr->value);
break;
}
Rdattr = Rdattr->next;
}
EntryRegisteredEvent->Logeventsregister = (char *) malloc (strlen(TagValue));
strcpy(EntryRegisteredEvent->Logeventsregister,TagValue);
}
if (!strcmp(TagName,"CheckSum"))
Reader->CheckSum = atoi(TagValue);
if (!strcmp(TagName,"EventFailoverCheck"))
Reader->EventFailoverCheck = atoi(TagValue);
if (!strcmp(TagName,"Failoverfilepath"))
strcpy(Reader->Failoverfilepath,TagValue);
if (!strcmp(TagName,"Delimiter"))
strcpy(Reader->Delimiter,TagValue);
if (!strcmp(TagName,"SysLogHeader"))
Reader->SysLogHeader = atoi(TagValue);
}
// Reader.h skipped