Listing 1

class PBConsole : public IPBX_NonVisualObject
{
enum MethodIds
{
midRead,
midReadLine,
midWrite,
midWriteLine
};

public:
PBConsole();
~PBConsole();

virtual PBXRESULT Invoke
(
IPB_Session *session,
pbobject obj,
pbmethodID mid,
PBCallInfo *ci
);

virtual void Destroy();

private:
PBXRESULT read(IPB_Session *session, 
pbobject obj, PBCallInfo *ci);
PBXRESULT readLine(IPB_Session *session, 
pbobject obj, PBCallInfo *ci);
PBXRESULT write(IPB_Session *session, 
pbobject obj, PBCallInfo *ci);
PBXRESULT writeLine(IPB_Session *session, 
pbobject obj, PBCallInfo *ci);
};

Listing 2

PBXRESULT PBConsole::read(IPB_Session *session, 
pbobject obj, PBCallInfo *ci)
{
pbint c = (pbint)tcin.get();
ci->returnValue->SetInt(c);
return PBX_OK;
}

PBXRESULT PBConsole::readLine(IPB_Session *session,
pbobject obj, PBCallInfo *ci)
{
TCHAR buf[256];

tcin.getline(&buf[0], 255);
ci->returnValue->SetString(buf);

return PBX_OK;
}

PBXRESULT PBConsole::write(IPB_Session *session, 
pbobject obj, PBCallInfo *ci)
{
pbstring pbs = ci->pArgs->GetAt(0)->GetString();
LPCTSTR s = session->GetString(pbs);
tcout << s;

return PBX_OK;
}

PBXRESULT PBConsole::writeLine(IPB_Session *session, 
pbobject obj, PBCallInfo *ci)
{
pbstring pbs = ci->pArgs->GetAt(0)->GetString();
LPCTSTR s = session->GetString(pbs);
tcout << s << std::endl;

return PBX_OK;
}

Listing 3

int main(int argc, char* argv[])
{
tstring appName;
vector<tstring> liblist;
parseOptions(argc, argv, appName, liblist);

HINSTANCE hinst = LoadLibrary("pbvm90.dll");
if (hinst == NULL)
{
fprintf(stderr, "Failed to load PBVM ");
return 1;
}

P_PB_GetVM getvm = (P_PB_GetVM)GetProcAddress(hinst,
"PB_GetVM");
IPB_VM* vm = NULL;
getvm(&vm);

IPB_Session* session = NULL;

LibList ll(liblist);

PBXRESULT result = vm->RunApplication(appName.c_str(),
(LPCTSTR*)ll.getLibList(), ll.getNumLibs(), NULL, &session);

if (result == PBX_OK && session != NULL)
session->Release();

FreeLibrary(hinst);
return 0;
}

Additional Code for this Article zip file ~422 KB