Code: Select all
using System;
using System.Runtime.InteropServices;
namespace COMServer
{
[ComVisible(true)]
[Guid(ContractGuids.ServerClass)]
public class Server : IServer
{
double IServer.ComputePi()
{
double sum = 0.0;
int sign = 1;
for (int i = 0; i < 1024; ++i)
{
sum += sign / (2.0 * i + 1.0);
sign *= -1;
}
return 4.0 * sum;
}
}
}
[
uuid(b5bfbf8c-bebc-4eaa-8efc-a96d770a874b),
version(1.0),
]
library COMServer
{
importlib("stdole2.tlb");
[object, uuid(DB1797F5-7198-4411-8563-D05F4E904956)]
interface IServer : IUnknown {
double ComputePi();
};
};
< /code>
Ich habe auch 'ba9ac84b-c7fc-41cf-8b2f-1764eb773d4b' ausprobiert. Dies ist die Server-Schnittstelle hier, aber dies funktioniert auch, wenn der Versuch, aus C ++ zuzugreifen, gemacht wird. < /p>
Ich habe zwei Beispiele gefunden, die gezeigt haben Anzug, einer ist: < /p>
#import "COMServer.tlb"
using namespace COMServer;
CoInitialize(nullptr);
IServerPtr pServerPtr(__uuidof(IServer));
std::cout ComputePi()
Und das andere ist: < /p>
#import "COMServer.tlb"
using namespace COMServer;
CoInitialize(nullptr);
COMServer::IServerPtr pServerPtr;
HRESULT hRes = pServerPtr.CreateInstance(__uuidof(COMServer::IServer));
std::cout ComputePi()
In beiden Fällen scheint psserverptr null und ein 'e_pointer ungültiger Zeiger' zu sein. Die Ausnahme tritt auf, wenn Sie versuchen, die Computpi -Funktion auszuführen. Ein klares Beispiel für das Schreiben einer IDL -Datei für Microsoft Comserverdemo -Beispiel kann ein guter Ausgangspunkt für andere und mich sein>