*.idl
-
ich weis. ich habe auch schon mit LPTSTR, string und BSTR auch versucht.
bei 'extern int i;' hat er nicht gemekert aber er gibt mir die Variable dann nicht her in Outlook.
-
LPTSTR, string funktionieren auch NICHT !!!
Zeig mal Deine idl und die dazugehörige ATL-Funktion!
-
Die *.idldatei:
import "oaidl.idl";
import "ocidl.idl";[
object,
uuid(50157914-AE8F-4082-AD75-9858F83F307D),
dual,
helpstring("IDokuV-Schnittstelle"),
pointer_default(unique)
]
interface IDokuV : IDispatch
{
HRESULT ShowDokuDlg();
};[
uuid(D888874D-010E-46E1-88AE-54B051C3DE8A),
version(1.0),
helpstring("DokuVerwaltung 1.0")
]library DOKUVERWALTUNGLib
{
importlib("stdole32.tlb");
importlib("stdole2.tlb");[
uuid(8494871A-9F9E-428B-92EB-9A79FF81D9FE),
helpstring("DokuV Class")
]
coclass DokuV
{
[default] interface IDokuV;
};
};
cpp-Datei:
// DokuV.cpp : Implementierung von CDokuV
#include "stdafx.h"
#include "DokuVerwaltung.h"
#include "DokuV.h"/////////////////////////////////////////////////////////////////////////////
// CDokuVSTDMETHODIMP CDokuV::ShowDokuDlg()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CDokuVerwaltung dlgD;
dlgD.DoModal();
return 0;
}h-datei:
#ifndef __DOKUV_H_
#define __DOKUV_H_#include "resource.h" // Hauptsymbole
#include "DokuVerwaltung1.h"/////////////////////////////////////////////////////////////////////////////
// CDokuV
class ATL_NO_VTABLE CDokuV :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CDokuV, &CLSID_DokuV>,
public IDispatchImpl<IDokuV, &IID_IDokuV, &LIBID_DOKUVERWALTUNGLib>
{
public:CDokuV()
{}
DECLARE_REGISTRY_RESOURCEID(IDR_DOKUV)
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CDokuV)
COM_INTERFACE_ENTRY(IDokuV)
COM_INTERFACE_ENTRY(IDispatch)
END_COM_MAP()// IDokuV
public:
(ShowDokuDlg)();
};#endif //__DOKUV_H_
-
1. Code-Tags verwenden
2. Da steht ja gar keine Funktion, womit Du Strings übergeben willst
3. Die Funktion in Deinem interface besitzt keine Dispatch-ID!
-
geht es nicht das ich einfach eine variable deklarire?
-
Nö
-
kannst du mir vielleicht ein beispiel zeigen wie ich das realisieren kann.
-
interface IDokuV : IDispatch { [id(1), helpstring("method ShowDokuDlg")] HRESULT ShowDokuDlg(); [id(2), helpstring("method GetString")] HRESULT GetString( BSTR* returnedString); }; class ATL_NO_VTABLE CDokuV : ... { // ... HRESULT ShowDokuDlg() { m_String = "Das ist ein TestString"; return E_NOTIMPL; } CComBSTR m_String; HRESULT GetString( BSTR* returnedString) { return m_String.CopyTo( returnedString); } };
-
Danken erstmal. aber
ich musste den qelltext etwas änder, weil entweder outlook mekerte oder c++
und trotzdem kriege ich in outlook beim ausführen der zeilen
Dim d As DOKUVERWALTUNGLib.DokuV
Dim s As String
Set d = New DOKUVERWALTUNGLib.DokuV
d.ShowDokuDlg
d.GetString (s)
MsgBox s
Set d = Nothingden text "Das ist ein TestString" nicht zurück
/////////////////////////////////////////////////////////////////////////////
// CDokuVSTDMETHODIMP CDokuV::ShowDokuDlg()
{
m_String = "Das ist ein TestString";
return 0;
}STDMETHODIMP CDokuV::GetString(BSTR* returnedString)
{
return m_String.CopyTo( returnedString);
}// DokuV.h : Deklaration von CDokuV
#ifndef __DOKUV_H_
#define __DOKUV_H_#include "resource.h" // Hauptsymbole
#include "DokuVerwaltung1.h"/////////////////////////////////////////////////////////////////////////////
// CDokuV
class ATL_NO_VTABLE CDokuV :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CDokuV, &CLSID_DokuV>,
public IDispatchImpl<IDokuV, &IID_IDokuV, &LIBID_DOKUVERWALTUNGLib>
{
public:CDokuV()
{
}CComBSTR m_String;
DECLARE_REGISTRY_RESOURCEID(IDR_DOKUV)
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CDokuV)
COM_INTERFACE_ENTRY(IDokuV)
COM_INTERFACE_ENTRY(IDispatch)
END_COM_MAP()// IDokuV
public:
STDMETHOD(ShowDokuDlg)();
STDMETHOD(GetString)(BSTR* returnedString);
};#endif //__DOKUV_H_
-
versuch mal das Interface so:
interface IDokuV : IDispatch { [id(1), helpstring("method ShowDokuDlg")] HRESULT ShowDokuDlg(); [id(2), helpstring("method GetString")] HRESULT GetString( [out,retval] BSTR* returnedString); };
-
klappt trotzdem nicht.
-
Hm, habs mal im Makroeditor von VC getestet, bei mir geht's
Dim d As Object Dim s As String d = CreateObject("DOKUVERWALTUNGLib.DokuV") d.GetString( s) MsgBox( s)
-
ich hab es in vba von outlook ausprobiert. da kamm eine fehlermeldung: Objekterstellung durch Active-X Komponente nicht möglich bei der Zeile
'd =CreateObject("DOKUVERWALTUNGLib.DokuV")'
-
kannst Du das Projekt mal packen und mir zuschicken?