Hello,
We continue to study this problem. However, more probably, the problem is due to Oci.dll that doesn't free the libraries that it uses.
We have checked this behaviour not using our components. We just used Api methods for downloading and uploading libraries, the library's methods (Delphi), and also the Oci.h and Oci.Lib files (C++) distributed together with Oracle. In both cases, the additionally downloaded libraries remain not uploaded till the end of the application work. There is a code of these projects.
Code: Select all
program ConsolApplication;
{$APPTYPE CONSOLE}
uses
SysUtils,
Windows;
type
_OCIEnvCreate = function (var envhpp: pointer; mode: cardinal; const ctxp: pointer;
const malocfp: pointer; const ralocfp: pointer;
const mfreefp: pointer; xtramemsz: Cardinal; usrmempp: pointer): integer; cdecl;
_OCIHandleFree = function (hndlp: pointer; htype: Cardinal): integer; cdecl;
_OCITerminate = function (mode: Cardinal): integer; cdecl;
var
hOraLib: HMODULE;
hOCIEnv: pointer;
hOCIError: pointer;
OCIEnvCreate: _OCIEnvCreate;
OCIHandleFree: _OCIHandleFree;
OCITerminate: _OCITerminate;
begin
hOraLib := LoadLibraryEx('Path to oci.dll',0, LOAD_WITH_ALTERED_SEARCH_PATH);
OCIEnvCreate := GetProcAddress(hOraLib, 'OCIEnvCreate');
OCIEnvCreate(hOCIEnv,7,nil, nil, nil, nil, 0, nil);
OCIHandleFree := GetProcAddress(hOraLib, 'OCIHandleFree');
OCIHandleFree(hOCIEnv,1);
OCITerminate := GetProcAddress(hOraLib, 'OCITerminate');
OCITerminate(0);
FreeLibrary(hOraLib);
ReadLn;
end.
Code: Select all
#include
#include
#include
using namespace std;
void checkerr(OCIError* err, sword status) {
text errbuf[512];
ub4 buflen;
sb4 errcode;
switch (status) {
case OCI_SUCCESS:
break;
case OCI_SUCCESS_WITH_INFO:
printf("Error - OCI_SUCCESS_WITH_INFO\n");
break;
case OCI_NEED_DATA:
printf("Error - OCI_NEED_DATA\n");
break;
case OCI_NO_DATA:
printf("Error - OCI_NO_DATA\n");
break;
case OCI_ERROR:
OCIErrorGet ( err, (ub4) 1, (text *) NULL, &errcode, errbuf, (ub4) sizeof(errbuf), (ub4) OCI_HTYPE_ERROR);
printf("Error - %s\n", errbuf);
break;
case OCI_INVALID_HANDLE:
printf("Error - OCI_INVALID_HANDLE\n");
break;
case OCI_STILL_EXECUTING:
printf("Error - OCI_STILL_EXECUTE\n");
break;
case OCI_CONTINUE:
printf("Error - OCI_CONTINUE\n");
break;
default:
break;
}
}
int main(int argc, char *argv[])
{
OCIEnv* env;
OCIError* err;
OCIServer* srv;
OCISvcCtx* svc;
OCISession* ses;
OCISvcCtx* svchp;
sword r;
text bufp;
env = 0;
err = 0;
srv = 0;
svc = 0;
ses = 0;
r=OCIEnvCreate( &env, OCI_DEFAULT, 0, 0, 0, 0, 0, 0);
if (r != OCI_SUCCESS) {
printf("OCIEnvCreate failed!\n");
goto clean_up;
}
OCIHandleAlloc(env, (dvoid**)&err, OCI_HTYPE_ERROR, 0, 0);
OCIHandleAlloc(env, (dvoid**)&srv, OCI_HTYPE_SERVER, 0, 0);
OCIHandleAlloc(env, (dvoid**)&svc, OCI_HTYPE_SVCCTX, 0, 0);
OCIHandleAlloc(env, (dvoid**)&ses, OCI_HTYPE_SESSION, 0, 0);
r=OCIServerAttach(srv, err, (text* )"orcl1020", strlen("orcl1020"), (ub4) OCI_DEFAULT);
if (r != OCI_SUCCESS) {
checkerr(err, r);
goto clean_up;
}
OCIAttrSet(svc, OCI_HTYPE_SVCCTX, srv, 0, OCI_ATTR_SERVER, err);
OCIAttrSet(ses, OCI_HTYPE_SESSION, (text* )"scott", strlen("scott"), OCI_ATTR_USERNAME, err);
OCIAttrSet(ses, OCI_HTYPE_SESSION, (text* )"tiger", strlen("tiger"), OCI_ATTR_PASSWORD, err);
r=OCISessionBegin (svc, err, ses, OCI_CRED_RDBMS, OCI_DEFAULT);
checkerr(err, r);
clean_up:
if (env) OCIHandleFree(env, OCI_HTYPE_ENV );
if (err) OCIHandleFree(err, OCI_HTYPE_ERROR );
if (srv) OCIHandleFree(srv, OCI_HTYPE_SERVER);
if (svc) OCIHandleFree(svc, OCI_HTYPE_SVCCTX);
OCITerminate(OCI_DEFAULT);
system("PAUSE");
return EXIT_SUCCESS;
}
Try ask this question at the Oracle developers forum