在C+中调用函数+;在不知道返回类型的情况下按其地址 < >我想用C++的DLL调用C函数,其地址是:< /P>

在C+中调用函数+;在不知道返回类型的情况下按其地址 < >我想用C++的DLL调用C函数,其地址是:< /P>,c++,c,memory-address,function-call,C++,C,Memory Address,Function Call,我知道如何在返回类型已知的情况下执行此操作 但是,如果我不知道返回类型,我能做什么?我已经尝试了“TyPufFAuto'”,但是看起来你不能使用Auto.To。 < P>如果返回的类型是未知的或不重要的,你可以在函数定义中使用空洞> /CUT>,或者如果它是任何指针,你可以使用“代码> Value*/Cuffe >,但是如果函数是在C编码的DLL中,你会用C++代码使用它。然后,你可以利用和共享几乎所有C代码中定义的类型,因为C++是C</P的超集。 我说,我准备了一个小例子,它的结构叫做“代码

我知道如何在返回类型已知的情况下执行此操作


但是,如果我不知道返回类型,我能做什么?我已经尝试了“TyPufFAuto'”,但是看起来你不能使用Auto.To。

< P>如果返回的类型是未知的或不重要的,你可以在函数定义中使用<代码>空洞> /CUT>,或者如果它是任何指针,你可以使用“代码> Value*/Cuffe >,但是如果函数是在C编码的DLL中,你会用C++代码使用它。然后,你可以利用和共享几乎所有C代码中定义的类型,因为C++是C</P的超集。

我说,我准备了一个小例子,它的结构叫做“代码> PyObjult< /Cult>,C和C++代码共享。 为此,最好使用共享类型/定义创建标题:

#ifndef PYOBJECT_DLL_H
#define PYOBJECT_DLL_H

#ifdef __cplusplus
extern "C" {
#endif

// Common structure definition
typedef struct PyObject{
    int field1;
    char *field2;
} PyObject;

// Public function pointer type declaration
typedef PyObject *(*__stdcall getPyObject_t)(int arg1, const char *arg2);

#ifdef __cplusplus
}
#endif

#endif  // PYOBJECT_DLL_H

假设带有导出函数的C代码类似于:

#include "pyobject.h"
#include <stdlib.h>

#ifdef __cplusplus
extern "C" 
#endif
__declspec(dllexport) PyObject * getPyObject(int arg1, char *arg2);

PyObject *getPyObject(int arg1, char *arg2){
    PyObject *obj = (PyObject *)malloc(sizeof(PyObject));
    obj->field1 = arg1;
    obj->field2 = arg2;
    return obj;
}
#包括“pyobject.h”
#包括
#ifdef_uucplusplus
外部“C”
#恩迪夫
__declspec(dllexport)PyObject*getPyObject(int arg1,char*arg2);
PyObject*getPyObject(int arg1,char*arg2){
PyObject*obj=(PyObject*)malloc(sizeof(PyObject));
obj->field1=arg1;
obj->field2=arg2;
返回obj;
}

最后,使用库中创建的函数和数据的C++代码将是:

#include "pyobject.h"
#include <iostream>
#include <windows.h>

int main() {
    HINSTANCE dll = LoadLibrary("pyobject.dll");
    if (dll == NULL) {
        std::cerr << "Cannot open pyobject.dll. Error: " << GetLastError() << "\n";
        return 1;
    }

    getPyObject_t getPyObject = (getPyObject_t) GetProcAddress(dll, "getPyObject");
    if (getPyObject == NULL) {
        std::cerr << "Cannot locate 'getPyObject' function in dll. Error: " << GetLastError() << "\n";
        FreeLibrary(dll);
        return 2;
    }

    PyObject *obj = getPyObject(3, "test");
    std::cout << "PyObject == { field1: " << obj->field1 << ", field2: \"" << obj->field2 << "\"}\n";

    FreeLibrary(dll);
    return 0;
}
#包括“pyobject.h”
#包括
#包括
int main(){
HINSTANCE dll=LoadLibrary(“pyobject.dll”);
如果(dll==NULL){

如果您不知道返回类型,您希望发生什么?函数必须被调用的方式(调用约定)取决于它的返回类型。坏消息是,如果你在编译时不知道返回类型,没有一大块手工编写的汇编语言,这是不可能的。好消息是,有人已经为你手工编写了汇编语言:……如果你可以说“这是一个PyObject*”,那么您在编译时就知道类型了,不是吗?为什么不能在typedef中使用
PyObject*
?您试图解决的真正问题是什么?转发声明如何?
struct PyObject;
,您可以将其用作返回类型。如果返回类型是一个大聚合,则调用约定会改变。