問題是這. 我需要經由Java來使用VB Activex DLL(fctopartno.dll), 但不知該如何用,
所以想說用VC++把DLL叫來用,再透過JNI與JAVA溝通....由於對MS COM/OLE/VB/VC++ 不熟,看
了一堆書還是一頭霧水....那個DLL中有個class Fctopartnumber, 我要從 Java 中呼叫
"TranslateFcodeToPartNo"及"CloseDatabase"兩個Subroutine, 而"TranslateFcodeToPartNo"
把回傳的值放在傳送過去的參數"retVal"中, 請問我應該如何寫才能收到的回傳的值? 感激不盡...
ps: 請問是不是還是有更方便的方式可以達成我要的功能??? 謝謝 :~~~)
#include <windows.h>
#include <stdio.h>
HRESULT AutoWrap(int autoType, VARIANT *pvResult, IDispatch *pDisp, LPOLESTR ptName, int cArgs...) {
// Begin variable-argument list...
va_list marker;
va_start(marker, cArgs);
if(!pDisp) {
MessageBox(NULL, "NULL IDispatch passed to AutoWrap()", "Error", 0x10010);
_exit(0);
}
// Variables used...
DISPPARAMS dp = { NULL, NULL, 0, 0 };
DISPID dispidNamed = DISPID_PROPERTYPUT;
DISPID dispID;
HRESULT hr;
char buf[200];
char szName[200];
// Convert down to ANSI
WideCharToMultiByte(CP_ACP, 0, ptName, -1, szName, 256, NULL, NULL);
// Get DISPID for name passed...
hr = pDisp->GetIDsOfNames(IID_NULL, &ptName, 1, LOCALE_USER_DEFAULT, &dispID);
if(FAILED(hr)) {
sprintf(buf, "IDispatch::GetIDsOfNames(\"%s\") failed w/err 0x%08lx", szName, hr);
MessageBox(NULL, buf, "AutoWrap()", 0x10010);
_exit(0);
return hr;
}
// Allocate memory for arguments...
VARIANT *pArgs = new VARIANT[cArgs+1];
// Extract arguments...
for(int i=0; i<cArgs; i++) {
pArgs[i] = va_arg(marker, VARIANT);
}
// Build DISPPARAMS
dp.cArgs = cArgs;
dp.rgvarg = pArgs;
// Handle special-case for property-puts!
if(autoType & DISPATCH_PROPERTYPUT) {
dp.cNamedArgs = 1;
dp.rgdispidNamedArgs = &dispidNamed;
}
// Make the call!
hr = pDisp->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, autoType, &dp, pvResult, NULL, NULL);
if(FAILED(hr)) {
sprintf(buf, "IDispatch::Invoke(\"%s\"=%08lx) failed w/err 0x%08lx", szName, dispID, hr);
MessageBox(NULL, buf, "AutoWrap()", 0x10010);
_exit(0);
return hr;
}
// End variable-argument section...
va_end(marker);
delete [] pArgs;
return hr;
}
void main(){
VARIANT root[64] = {0}; // Generic IDispatchs
VARIANT parm[64] = {0}; // Generic Parameters
VARIANT rVal = {0}; // Temporary result holder
int level=0; // Current index into root[]
// Initialize the OLE Library...
OleInitialize(NULL);
VARIANT cfrFileName, dirName, tmpName, retVal;
// Line 5: Dim PnoTranObj As Object
VARIANT PnoTranObj = {0};
// Line 6: Set PnoTranObj = CreateObject FcToPartNo.FcToPartNumber
{
CLSID clsid;
CLSIDFromProgID(L"FcToPartNo.FcToPartNumber", &clsid);
HRESULT hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER|CLSCTX_INPROC_SERVER, IID_IDispatch, (void **)&rVal.pdispVal);
if(FAILED(hr)) {
char buf[256];
sprintf(buf, "CoCreateInstance() for \"FcToPartNo.FcToPartNumber\" failed. Err=%08lx", hr);
::MessageBox(NULL, buf, "Error", 0x10010);
_exit(0);
}
rVal.vt = VT_DISPATCH;
}
VariantCopy(&PnoTranObj, &rVal);
VariantClear(&rVal);
// Line 7: PnoTranObj.TranslateFcodeToPartNo cfrFileName , dirName , tmpName , retVal
VariantCopy(&root[++level], &PnoTranObj);
VariantCopy(&parm[0], &cfrFileName);
VariantCopy(&parm[1], &dirName);
VariantCopy(&parm[2], &tmpName);
VariantCopy(&parm[3], &retVal);
AutoWrap(DISPATCH_METHOD, NULL, root[level].pdispVal, L"TranslateFcodeToPartNo", 4, parm[3], parm[2], parm[1], parm[0]);
VariantClear(&parm[0]);
VariantClear(&parm[1]);
VariantClear(&parm[2]);
VariantClear(&parm[3]);
VariantClear(&root[level--]);
// Line 8: PnoTranObj.CloseDatabase
VariantCopy(&root[++level], &PnoTranObj);
AutoWrap(DISPATCH_METHOD, NULL, root[level].pdispVal, L"CloseDatabase", 0);
VariantClear(&root[level--]);
// Clearing variables
VariantClear(&cfrFileName);
VariantClear(&dirName);
VariantClear(&tmpName);
VariantClear(&retVal);
VariantClear(&PnoTranObj);
// Close the OLE Library...
OleUninitialize();
}
--
╭────────────────‧╭────────────────╮
│ [1;31m ╭──╮ ╮╭─ ──╮ ╮╭─╮ [m│ [1;33m 成大工程科學忘情小築站 [m│
│ [1;37m ╰──╮─┼╯ ╭──┤ ├╯ [m│ [1;37m [m│
│ [1;34m ╰──╯ ╰──╰──┴ ┴─ [m│ [1;36m 140.116.39.100 [32m- [34m★ [32m - [m│
╰─────────────────╯‧───────────────╯
[m※ 來源:‧ [1;34;47m成大工科忘情小築 [0m bbs.es.ncku.edu.tw‧[FROM: socks1.rocheste] [m [40m