Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

請問觀於VC++呼叫VB寫成的DLL相關問題..謝謝

0 views
Skip to first unread message

紫色海葵

unread,
Apr 8, 2000, 3:00:00 AM4/8/00
to
各位前輩, 小弟不才,已經被這問題搞了一個星期還是無解...
眼看下星期一就要交了...只要求助網上高手..

問題是這. 我需要經由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

0 new messages