¿Hay alguna manera de hacer que los dlls C++ construidos con diferentes compiladores sean compatibles entre sí? Las clases pueden tener métodos de fábrica para creación y destrucción, por lo que cada compilador puede usar su propio nuevo/eliminar (ya que los tiempos de ejecución diferentes tienen sus propios montones).Compatibilidad Dll entre compiladores
He probado el siguiente código pero se estrelló en el primer método de la barra:
interface.h
#pragma once
class IRefCounted
{
public:
virtual ~IRefCounted(){}
virtual void AddRef()=0;
virtual void Release()=0;
};
class IClass : public IRefCounted
{
public:
virtual ~IClass(){}
virtual void PrintSomething()=0;
};
test.cpp compilado con VC9, test.exe
#include "interface.h"
#include <iostream>
#include <windows.h>
int main()
{
HMODULE dll;
IClass* (*method)(void);
IClass *dllclass;
std::cout << "Loading a.dll\n";
dll = LoadLibraryW(L"a.dll");
method = (IClass* (*)(void))GetProcAddress(dll, "CreateClass");
dllclass = method();//works
dllclass->PrintSomething();//crash: Access violation writing location 0x00000004
dllclass->Release();
FreeLibrary(dll);
std::cout << "Done, press enter to exit." << std::endl;
std::cin.get();
return 0;
}
una .cpp compilado con g ++ g ++. exe -shared c.cpp -o c.dll
#include "interface.h"
#include <iostream>
class A : public IClass
{
unsigned refCnt;
public:
A():refCnt(1){}
virtual ~A()
{
if(refCnt)throw "Object deleted while refCnt non-zero!";
std::cout << "Bye from A.\n";
}
virtual void AddRef()
{
++refCnt;
}
virtual void Release()
{
if(!--refCnt)
delete this;
}
virtual void PrintSomething()
{
std::cout << "Hello World from A!" << std::endl;
}
};
extern "C" __declspec(dllexport) IClass* CreateClass()
{
return new A();
}
EDIT: Agregué la siguiente línea al método CreateClass de GCC, el texto se imprimió correctamente en la consola, por lo que su llamada de función es la que lo está matando.
std::cout << "C.DLL Create Class" << std::endl;
Me preguntaba, ¿cómo gestionar COM para mantener la compatibilidad binaria incluso a través de las lenguas, ya que sus Básicamente todas las clases con inheritence (aunque sólo individual) y, por tanto, las funciones virtuales. No me molestan masivamente si no puedo haber sobrecargado operadores/funciones, siempre y cuando pueda mantener las cosas básicas de OOP (es decir, clases y herencia única).
¿Cómo lo hace COM? Con llamadas RPC livianas, podría construir su aplicación usando dce-rpc y obtendría los mismos resultados. En ningún caso, COM proporciona un puntero a la memoria de un dll externo, realiza llamadas de función a ese dll. – gbjbaanb
Los siguientes artículos [aquí] (http://eli.thegreenplace.net/2011/09/16/exporting-c-classes-from-a-dll/), [aquí] (http: //www.codeproject. com/Articles/28969/HowTo-Export-C-classes-from-a-DLL # CppMatureApproach), y [aquí] (http://chadaustin.me/cppinterface.html) pueden ser útiles. El ejemplo de su código casi está disponible, excepto el destructor virtual integrado. AFAIK, todos los métodos en su interfaz abstracta deben ser puros virtuales '= 0'. – greatwolf