#include <jni.h>
#include "atlbase.h"
#include "atlconv.h"
#include "JCom.h"
#include "jp_ne_so_0005fnet_ga2_no_0005fji_jcom_ITypeLib.h"
/* **********************************************************************
* Class: jp_ne_so_0005fnet_ga2_no_0005fji_jcom_ITypeLib
* Method: _getTypeInfoCount
* Signature: ()I
ITypeInfo̐擾
* **********************************************************************/
JNIEXPORT jint JNICALL Java_jp_ne_so_1net_ga2_no_1ji_jcom_ITypeLib__1getTypeInfoCount
(JNIEnv *env, jobject obj)
{
// ITypeLibC^[tF[XoB
jclass cls = env->GetObjectClass(obj);
jfieldID fieldID = env->GetFieldID(cls, "pIUnknown", "I");
ITypeLib* pITypeLib = (ITypeLib*)env->GetIntField(obj, fieldID);
if(pITypeLib == NULL) {
// OZbg
jclass clsJComException = env->FindClass(CLASS_JCOM_EXCEPTION);
env->ThrowNew(clsJComException, "ITypeLib not created");
return NULL;
}
// ITypeInfo̐擾
int typeinfocount = pITypeLib->GetTypeInfoCount();
return (jint)typeinfocount;
}
/* **********************************************************************
* Class: jp_ne_so_0005fnet_ga2_no_0005fji_jcom_ITypeLib
* Method: _getTypeInfo
* Signature: (I)I
w肳ꂽindexITypeInfoԂ
* **********************************************************************/
JNIEXPORT jint JNICALL Java_jp_ne_so_1net_ga2_no_1ji_jcom_ITypeLib__1getTypeInfo
(JNIEnv *env, jobject obj, jint index)
{
// ITypeLibC^[tF[XoB
jclass cls = env->GetObjectClass(obj);
jfieldID fieldID = env->GetFieldID(cls, "pIUnknown", "I");
ITypeLib* pITypeLib = (ITypeLib*)env->GetIntField(obj, fieldID);
if(pITypeLib == NULL) {
// OZbg
jclass clsJComException = env->FindClass(CLASS_JCOM_EXCEPTION);
env->ThrowNew(clsJComException, "ITypeLib not created");
return NULL;
}
// w肳ꂽindexITypeInfo擾
ITypeInfo* pITypeInfo = NULL;
HRESULT hr = pITypeLib->GetTypeInfo(index, &pITypeInfo);
if(FAILED(hr)) {
// OZbg
jclass clsJComException = env->FindClass(CLASS_JCOM_EXCEPTION);
char message[256];
sprintf(message, "ITypeLib::GetTypeInfo(%d) FAILED HRESULT=0x%X", index, hr);
env->ThrowNew(clsJComException, message);
return NULL;
}
// intɂĕԂBĂяo͎gpRelease()邱ƁB
return (jint)(int)pITypeInfo;
}
/* **********************************************************************
* Class: jp_ne_so_0005fnet_ga2_no_0005fji_jcom_ITypeLib
* Method: _getDocumentation
* Signature: (I)[Ljava/lang/String;
w肳ꂽԍ̃hLg擾B
index=-1̂Ƃ͎g̃hLgԂB
* **********************************************************************/
JNIEXPORT jobjectArray JNICALL Java_jp_ne_so_1net_ga2_no_1ji_jcom_ITypeLib__1getDocumentation
(JNIEnv *env, jobject obj, jint index)
{
// ITypeLibC^[tF[XoB
jclass cls = env->GetObjectClass(obj);
jfieldID fieldID = env->GetFieldID(cls, "pIUnknown", "I");
ITypeLib* pITypeLib = (ITypeLib*)env->GetIntField(obj, fieldID);
if(pITypeLib == NULL) {
// OZbg
jclass clsJComException = env->FindClass(CLASS_JCOM_EXCEPTION);
env->ThrowNew(clsJComException, "ITypeLib not created");
return NULL;
}
BSTR bstrName;
BSTR bstrDocString;
unsigned long dwHelpContext = 0;
BSTR bstrHelpFile;
HRESULT hr = pITypeLib->GetDocumentation( index,
&bstrName, &bstrDocString, &dwHelpContext, &bstrHelpFile );
if(FAILED(hr)) {
// G[ɂȂB
// ɂ̓hLgȂƂƁAvIȂ̂ƕׂB
return NULL;
}
// ̔zɕϊB
char helpcontext[256];
sprintf(helpcontext, "%d", dwHelpContext);
// 4Stringz쐬B
jclass clsString = env->FindClass("java/lang/String");
jobjectArray jresult = env->NewObjectArray(4, clsString, NULL);
if(jresult==NULL) {
// OZbg
char message[256];
sprintf(message, "NewObjectArray(%d) FAILED ",4);
jclass clsJComException = env->FindClass(CLASS_JCOM_EXCEPTION);
env->ThrowNew(clsJComException, message);
// mۂIuWFNgׂĔj
if(bstrName!=NULL) SysFreeString(bstrName);
if(bstrDocString!=NULL) SysFreeString(bstrDocString);
if(bstrHelpFile!=NULL) SysFreeString(bstrHelpFile);
return NULL;
}
// 擾IuWFNgJavajava.lang.Stringɕϊ
// ɂ́ANULL̂̂̂Œ
if(bstrName!=NULL) {
jstring jstr = BSTR2jstring(env, bstrName);
env->SetObjectArrayElement(jresult, 0, jstr);
SysFreeString(bstrName);
}
if(bstrDocString != NULL) {
jstring jstr = BSTR2jstring(env, bstrDocString);
env->SetObjectArrayElement(jresult, 1, jstr);
SysFreeString(bstrDocString);
}
jstring jstr = BSTR2jstring(env, A2BSTR(helpcontext));
env->SetObjectArrayElement(jresult, 2, jstr);
if(bstrHelpFile != NULL) {
jstring jstr = BSTR2jstring(env, bstrHelpFile);
env->SetObjectArrayElement(jresult, 3, jstr);
SysFreeString(bstrHelpFile);
}
return jresult;
}
/* **********************************************************************
* Class: jp_ne_so_0005fnet_ga2_no_0005fji_jcom_ITypeLib
* Method: _getTLibAttr
* Signature: ()Ljp/ne/so_net/ga2/no_ji/jcom/ITypeLib$TLibAttr;
* **********************************************************************/
JNIEXPORT jobject JNICALL Java_jp_ne_so_1net_ga2_no_1ji_jcom_ITypeLib__1getTLibAttr
(JNIEnv *env, jobject obj)
{
// ITypeLibC^[tF[XoB
jclass cls = env->GetObjectClass(obj);
jfieldID fieldID = env->GetFieldID(cls, "pIUnknown", "I");
ITypeLib* pITypeLib = (ITypeLib*)env->GetIntField(obj, fieldID);
if(pITypeLib == NULL) {
// OZbg
jclass clsJComException = env->FindClass(CLASS_JCOM_EXCEPTION);
env->ThrowNew(clsJComException, "ITypeLib not created");
return NULL;
}
// TYPEATTR 擾
TLIBATTR* pTLibAttr = NULL;
HRESULT hr = pITypeLib->GetLibAttr(&pTLibAttr);
if(FAILED(hr)) {
// OZbg
char message[256];
sprintf(message, "ITypeLib::GetLibAttr() FAILED hr=0x%X.",hr);
jclass clsJComException = env->FindClass(CLASS_JCOM_EXCEPTION);
env->ThrowNew(clsJComException, message);
return NULL;
}
// LIBID,verMajor,verMinor擾
GUID LibID;
memcpy(&LibID, &pTLibAttr->guid, sizeof(GUID));
int verMajor = pTLibAttr->wMajorVerNum;
int verMinor = pTLibAttr->wMinorVerNum;
pITypeLib->ReleaseTLibAttr(pTLibAttr);
// GUIDCX^X
jclass clsGUID = env->FindClass(CLASS_GUID);
jmethodID method = env->GetMethodID(clsGUID, "<init>", "(ISSBBBBBBBB)V");
jobject jGuid = env->NewObject(clsGUID, method,
(jint)LibID.Data1,(jshort)LibID.Data2,(jshort)LibID.Data3,
(jbyte)LibID.Data4[0],(jbyte)LibID.Data4[1],(jbyte)LibID.Data4[2],(jbyte)LibID.Data4[3],
(jbyte)LibID.Data4[4],(jbyte)LibID.Data4[5],(jbyte)LibID.Data4[6],(jbyte)LibID.Data4[7]);
// TLibAttrCX^X (Ljp/ne/so_net/ga2/no_ji/jcom/ITypeLib;Ljp/ne/so_net/ga2/no_ji/jcom/GUID;II)V
jclass clsTLibAttr = env->FindClass(CLASS_TLIBATTR);
char sig[256];
sprintf(sig, "(L%s;L%s;II)V", CLASS_ITYPELIB, CLASS_GUID);
jmethodID mthTLibAttr = env->GetMethodID(clsTLibAttr, "<init>", sig);
jobject jTLibAttr = env->NewObject(clsTLibAttr, mthTLibAttr,
obj, jGuid, (jint)verMajor, (jint)verMinor);
return jTLibAttr;
}
/* **********************************************************************
* Class: jp_ne_so_0005fnet_ga2_no_0005fji_jcom_ITypeLib
* Method: _loadTypeLibEx
* Signature: (Ljava/lang/String;)I
LoadTypeLibEx()ĂсAITypeLib*ԂB
AREGKIND_NONEŁAWXgɓo^͂ȂB
* **********************************************************************/
JNIEXPORT jint JNICALL Java_jp_ne_so_1net_ga2_no_1ji_jcom_ITypeLib__1loadTypeLibEx
(JNIEnv *env, jclass cls, jstring szFile)
{
BSTR bstrFile = jstring2BSTR(env, szFile);
ITypeLib* pITypeLib = NULL;
HRESULT hr = LoadTypeLibEx(bstrFile, REGKIND_NONE, &pITypeLib);
SysFreeString(bstrFile);
if( FAILED(hr) ) {
// OZbg
char message[256];
sprintf(message, "LoadTypeLibEx() FAILED HRESULT=0x%Xh",hr);
jclass clsJComException = env->FindClass(CLASS_JCOM_EXCEPTION);
env->ThrowNew(clsJComException, message);
return 0;
}
return (jint)(int)pITypeLib;
}
/* **********************************************************************
* Class: jp_ne_so_0005fnet_ga2_no_0005fji_jcom_ITypeLib
* Method: _loadRegTypeLib
* Signature: (Ljp/ne/so_net/ga2/no_ji/jcom/GUID;II)I
* **********************************************************************/
JNIEXPORT jint JNICALL Java_jp_ne_so_1net_ga2_no_1ji_jcom_ITypeLib__1loadRegTypeLib
(JNIEnv *env, jclass cls, jobject guid, jint verMajor, jint verMinor)
{
// guidLIBIDɕϊ
GUID LIBID;
jobject2GUID(env, guid, &LIBID);
// Ăяo
ITypeLib* pITypeLib = NULL;
HRESULT hr = LoadRegTypeLib(LIBID, (unsigned short)verMajor, (unsigned short)verMinor,
GetUserDefaultLCID(), &pITypeLib);
if(FAILED(hr)) {
// OZbg
char message[256];
sprintf(message, "LoadRegTypeLib() FAILED hr=0x%X",hr);
jclass clsJComException = env->FindClass(CLASS_JCOM_EXCEPTION);
env->ThrowNew(clsJComException, message);
return NULL;
}
// ^CvCuԂ
return (jint)(int)pITypeLib;
}