Another little test.
I had more trouble than I should by forgetting to keep the exact same order of the declares!!
If you would rather I didn't clutter up your tutorial with my tests just say so.
James
PbServer
'SED_PBWIN
#COMPILE DLL "PBCTEST01.DLL"
#DIM ALL
#INCLUDE ONCE "WIN32API.INC"
$CLSID_cTest01 =GUID$("{EEDFBD9E-8CD7-43ae-8B58-6676EE2B1E72}")
$IID_iTest1 = GUID$("{7E58490E-8445-4b61-9CED-611846F835D7}")
CLASS cTest01 $CLSID_cTest01 AS COM
INSTANCE S1 AS STRING, iNum2 AS LONG
CLASS METHOD CREATE
STDOUT "Constructor Called #1"
iNum2 = 17
S1 = "James"
END METHOD
CLASS METHOD DESTROY
STDOUT "Destructor Called"
END METHOD
INTERFACE iTest1 $IID_iTest1 : INHERIT IUNKNOWN
METHOD Fx1(BYVAL iNum AS LONG)
STDOUT "Called Fx1 iNum = " + FORMAT$(iNum)
END METHOD
METHOD Fx2(BYVAL iNum AS LONG)
STDOUT "Called Fx2 iNum = " + FORMAT$(iNum)
END METHOD
METHOD iNum2_Get(iNum1 AS LONG)
iNum1 = iNum2
STDOUT "Called iNum2_Get = " + FORMAT$(iNum1)
END METHOD
METHOD iNum2_Set(BYVAL iNum AS LONG)
iNum2 = iNum
STDOUT "Called iNum2_Set = " + FORMAT$(iNum)
END METHOD
METHOD S1_Get(Param AS STRING)
Param = S1
END METHOD
METHOD S1_Set(Param AS STRING)
S1 = Param
STDOUT "Called S1_Set -> "+ S1
END METHOD
END INTERFACE
END CLASS
'==============================================================================
'MCM code
'------------------------------------------------------------------------------
FUNCTION STDOUT (Z AS STRING) AS LONG
' returns TRUE (non-zero) on success
LOCAL hStdOut AS LONG, nCharsWritten AS LONG
LOCAL w AS STRING
hStdOut = GetStdHandle (%STD_OUTPUT_HANDLE)
IF hSTdOut = -1& or hStdOut = 0& THEN ' invalid handle value, coded in line to avoid
' casting differences in Win32API.INC
' %NULL test added for Win/XP
AllocConsole
hStdOut = GetStdHandle (%STD_OUTPUT_HANDLE)
END IF
w = Z & $CRLF
FUNCTION = WriteFile(hStdOut, BYVAL STRPTR(W), LEN(W), nCharsWritten, BYVAL %NULL)
END FUNCTION
'==============================================================================
c++ client
#include <windows.h>
#include<OLEAUTO.H>
#include <stdio.h>
static const CLSID CLSID_cTest01 = {0xeedfbd9e, 0x8cd7, 0x43ae,{0x8b, 0x58, 0x66, 0x76, 0xee, 0x2b, 0x1e, 0x72}};
static const IID IID_iTest01 = {0x7e58490e, 0x8445, 0x4b61,{0x9c, 0xed, 0x61, 0x18, 0x46, 0xf8, 0x35, 0xd7}};
HRESULT (__stdcall* ptrDllGetClassObject) (const CLSID&, const IID&, void**);
interface iTest1 : IUnknown
{
virtual HRESULT __stdcall Fx1(int)=0;
virtual HRESULT __stdcall Fx2(int)=0;
virtual HRESULT __stdcall iNum2_Get(int*);
virtual HRESULT __stdcall iNum2_Set(int)=0;
virtual HRESULT __stdcall S1_Get(BSTR*);
virtual HRESULT __stdcall S1_Set(BSTR*);
};
int main(void)
{
iTest1* piTest01=NULL;
HRESULT hr;
IClassFactory* pCF=NULL;
HMODULE hDll=NULL;
int iNum2;
BSTR str1;
//Change Path Here
hDll=LoadLibrary("D:\\ComTutorial1A\\Server\\PbSource\\PBCTEST01.DLL");
ptrDllGetClassObject=(HRESULT (__stdcall*)(REFCLSID, REFIID, void**))GetProcAddress(hDll,"DllGetClassObject");
printf("ptrDllGetClassObject = %u\n",ptrDllGetClassObject);
hr=ptrDllGetClassObject(CLSID_cTest01,IID_IClassFactory,(void**)&pCF);
if(SUCCEEDED(hr))
{
pCF->CreateInstance(NULL,IID_iTest01,(void**)&piTest01);
pCF->Release();
hr=piTest01->Fx1(25);
hr=piTest01->Fx2(50);
hr=piTest01->iNum2_Get(&iNum2);
printf("iNum2 = %u\n",iNum2);
hr=piTest01->iNum2_Set(22);
hr=piTest01->iNum2_Get(&iNum2);
printf("iNum2 = %u\n",iNum2);
hr=piTest01->S1_Get(&str1);
printf("str1 = %s\n",str1);
SysFreeString(str1);
str1 = SysAllocStringByteLen("Fuller",6);
hr=piTest01->S1_Set(&str1);
SysFreeString(str1);
hr=piTest01->S1_Get(&str1);
printf("str1 = %s\n",str1);
SysFreeString(str1);
hr=piTest01->Release();
}
FreeLibrary(hDll);
getchar();
return 0;
}