From snowyfox at 163.com  Thu Feb  5 09:09:08 2015
From: snowyfox at 163.com (=?GBK?B?xLrI59Gp?=)
Date: Thu, 5 Feb 2015 16:09:08 +0800 (CST)
Subject: [Rd] How to unload R.dll successfully by FreeLibrary
Message-ID: <1db7cb4.a644.14b58c917d1.Coremail.snowyfox@163.com>

hi,
    I've some C++ code which try to load R.dll and execute some R command, then unload R.dll, yet it seems fail to unload it, so second time to call the function hangs since it is trying to Initialize R again(this is not allowed as documented). Anyone can tell me why, thanks.
//the following is my c++ code, used in a Visual Studio 2012 Console Application
#define ORAPI__cdecl
typedefBOOL(ORAPI*PFN_Rf_initEmbeddedR)(int argc, char *argv[]);
typedefvoid(ORAPI*PFN_Rf_endEmbeddedR)(int fatal);


staticvoid_simple_test()
{
#define STR_R_DLL_PATH_T("D:\\R\\R-3.1.2\\bin\\i386\\R.dll")
HMODULEm_hRDll = LoadLibrary(STR_R_DLL_PATH);
if ( m_hRDll )
{
PFN_Rf_initEmbeddedR pfnInit = (PFN_Rf_initEmbeddedR)GetProcAddress(m_hRDll, "Rf_initEmbeddedR");
PFN_Rf_endEmbeddedR pfnEnd = (PFN_Rf_endEmbeddedR)GetProcAddress(m_hRDll, "Rf_endEmbeddedR");


char*szArgs[] = {"REmbeddedPostgres", "--gui=none", "--silent"};
BOOL bRet = pfnInit(_countof(szArgs), szArgs); //call second time, this function will not return
//do something.
pfnEnd(0);
FreeLibrary(m_hRDll); //==> After this, R.dll still in memory, as I can see in Visual Studio 2012, Module window
}
}
//testing code end
int _tmain(int argc, _TCHAR* argv[])
{
_simple_test(); //first time, seems fine.
_simple_test(); //second time, hangs...
//_start_test_OR_Cache();
//_start_test_OR_Cache();
return 0;
}



????????????????????????????
	[[alternative HTML version deleted]]



[Rd] How to unload R.dll successfully by FreeLibrary
=?GBK?B?xLrI59Gp?=