[C++/ActiveX] ActiveX object maken en laden in IE

Pagina: 1
Acties:

  • Asperientje
  • Registratie: Juni 2004
  • Laatst online: 07-03-2015
hoi allemaal,

voor een opdracht moet ik een programma verbeteren, gezien het opnieuw laten bouwen teveel geld.
het programma gebruikt een .mdb via odbc om databasegegevens te updaten/lezen/etc.
verder is het programma geschreven in javascript in combinatie met een (activex) dll die in perl geschreven is. om de perlcode (die ik wel heb) te compilen, heb ik het probleem dat deze code nogal brak is en geschreven voor een zeer speciale (vreemde) compiler, die eigenlijk niet meer te krijgen is.

opzich allemaal mooi en wel, zei het niet dat de dll uitgebreid moet om meer dan 1 database te gebruiken. nu was ik even aan het knoeien in c++, gezien .net geen activex objecten wil of iig niet makkelijk kwam ik achter, maar nu krijg ik het niet voor elkaar om een netjes activx object te laden. ik maak de dll, met een atl-dll in visual studio 2003, hou hem zoals ie is en compile um met bijv. de naam testDll.
vervolgens registreer ik netjes de dll met: regsvr32 bestandsnaam
(na evt de oude dll unregistered te maken)

hierna probeer ik dan in een htmlfile:
goDbObj = new ActiveXObject("testDll")
maar deze geeft een error dat deze niet bestaat...

asjeblief wat hulp ???

Everything's got a meaning


  • Surehand
  • Registratie: Februari 2003
  • Laatst online: 08-01 16:05
Je moet in die aanroep niet de dll-naam meegeven, maar de progId. Zie msdn link.

Wat je ProgId is, kan ik echter niet uit de vraag halen.

  • Asperientje
  • Registratie: Juni 2004
  • Laatst online: 07-03-2015
ok dat snap ik, maar hoe stel ik in de code dan in wat mijn progId is???
(de naam van de classe die ik met __declspec(dllexport) exporteer???

Everything's got a meaning


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:19
Kan je even een betere topictitel verzinnen ?

https://fgheysels.github.io/


  • Surehand
  • Registratie: Februari 2003
  • Laatst online: 08-01 16:05
Het zal iets als "TestDll.TestDllCtrl" zijn. Dat moet je in je code terug kunnen vinden.

(Zoek anders naar IMPLEMENT_OLECREATE_EX in je code)

  • Asperientje
  • Registratie: Juni 2004
  • Laatst online: 07-03-2015
whoami schreef op maandag 10 juli 2006 @ 11:50:
Kan je even een betere topictitel verzinnen ?
als ik de titel kan wijzigen wel ja... kan ik dat (volgens mij niet maar zo ja, verlicht mij :) )
Surehand schreef op maandag 10 juli 2006 @ 11:56:
Het zal iets als "TestDll.TestDllCtrl" zijn. Dat moet je in je code terug kunnen vinden.

(Zoek anders naar IMPLEMENT_OLECREATE_EX in je code)
IMPLEMENT_OLECREATE_EX kan k nie vinden in me code, en dat testdll.testdllctrl zal ik even proberen :)

2maal dank! (whoami & SureHand)

Everything's got a meaning


  • Asperientje
  • Registratie: Juni 2004
  • Laatst online: 07-03-2015
dank aan jullie!!!

ik heb het gevonden denk ik:
ik moest een atl-project hebben met een dll ding,
en dan een atl-control classe toevoegen

en daar staat een ProgId :*)

Everything's got a meaning


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:19
Ik kan de titel wijzigen, vandaar dat ik je vraag om ff een betere topic titel te verzinnen; deze kan je melden mbhv een topic report (of desnoods via mail).

https://fgheysels.github.io/


  • Asperientje
  • Registratie: Juni 2004
  • Laatst online: 07-03-2015
het is me nu gelukt om de dll te laden in een activex object in javascript, ook is het me gelukt om een eigen functie te maken in het object, maar deze geeft telkens 'undefined' terug.
ik weet niet hoe dit kan, weet iemand dit wel??? :)
mijn code is de volgende (ingekort):

c++ code:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
__interface ITestDll : public IDispatch
{
    HRESULT getVersion([in, out] int& version);
};
// CTestDll
[
    coclass,
    threading("apartment"),
    vi_progid("TestDll"),
    progid("TestDll.1"),
    version(1.0),
    uuid("BE1A4B19-13D2-41BB-895A-C16406985A0E"),
    helpstring("TestDlly Class"),
    registration_script("control.rgs")
]
class ATL_NO_VTABLE CTestDll : 
    public ITestDll,
    public IPersistStreamInitImpl<CTestDll>,
    public IOleControlImpl<CTestDll>,
    public IOleObjectImpl<CTestDll>,
    public IOleInPlaceActiveObjectImpl<CTestDll>,
    public IViewObjectExImpl<CTestDll>,
    public IOleInPlaceObjectWindowlessImpl<CTestDll>,
    public CComControl<CTestDll>
{
public:
    STDMETHOD(getVersion)(int &version) {
        version = 22;
        return S_OK;
    }


javascript code:
Java:
1
2
3
4
    goDbObj = new ActiveXObject("TestDll")
    var version;
    alert(goDbObj.getVersion(version));
    alert("versie: " + version);


ik heb zelf de volgende link gelezen: http://www.microsoft.com/msj/0898/idl/idl.aspx
maar deze geeft me niet het inzicht waarom hij undefined zou zijn, gezien hij volgens mij netjes de waarde teruggeeft

[ Voor 37% gewijzigd door Asperientje op 12-07-2006 10:11 . Reden: foutjes verbeteren ]

Everything's got a meaning


  • Asperientje
  • Registratie: Juni 2004
  • Laatst online: 07-03-2015
weet echt niemand dit?

Everything's got a meaning


  • Asperientje
  • Registratie: Juni 2004
  • Laatst online: 07-03-2015
ok ik heb het nu uitgevonden, het moet de volgende code zijn:

in de headerfile
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
__interface ITestDll : public IDispatch
{
    [id(1), helpstring("returns the Version")]
    HRESULT getVersion([out, retval] LONG* version);
};

// CTestDll
[
    coclass,
    threading("apartment"),
    vi_progid("TestDll"),
    progid("MS.Verify.1"),
    version(1.0),
    uuid("BE1A4B19-13D2-41BB-895A-C16406985A0E"),
    helpstring("TestDll Class"),
    registration_script("control.rgs")
]
class ATL_NO_VTABLE CTestDll : 
    public ITestDll,
    public IPersistStreamInitImpl<CTestDll>,
    public IOleControlImpl<CTestDll>,
    public IOleObjectImpl<CTestDll>,
    public IOleInPlaceActiveObjectImpl<CTestDll>,
    public IViewObjectExImpl<CTestDll>,
    public IOleInPlaceObjectWindowlessImpl<CTestDll>,
    public CComControl<CTestDll>
{
public:
    STDMETHOD(getVersion)(LONG* version);


en dan in de cpp file:
C++:
1
2
3
4
STDMETHODIMP CTestDll::getVersion(LONG* version) {
    *version = 22;
    return S_OK;
}


het gaat dan om de declaratie die op de volgende manier is:
C++:
1
HRESULT getVersion([out, retval] LONG* version);

waarbij je dan [out, RETVAL] neerzet, en vooral de retval belangrijk is. (daarvan wist ik het bestaan niet)

[ Voor 18% gewijzigd door Asperientje op 13-07-2006 11:32 . Reden: verduidelijking ]

Everything's got a meaning

Pagina: 1