主题:minGW 调用MSVC的DLL, 无法传递参数....求高人解...
MSVC2005 部分:
// XyzLibrary.h
C/C++ code#ifdef XYZLIBRARY_EXPORTS
#define XYZAPI __declspec(dllexport)
#else
#define XYZAPI __declspec(dllimport)
#endif
#ifdef __cplusplus
# define EXTERN_C extern "C"
# define XYZHANDLE IXyz*
struct IXyz
{
virtual int Foo(int n) = 0;
virtual void Release() = 0;
};
#endif
EXTERN_C XYZAPI int hzf (int);
EXTERN_C XYZAPI XYZHANDLE hzfXyz (VOID);
// XyzLibrary.cpp
C/C++ code#include "stdafx.h"
#include "stdio.h"
#include "XyzLibrary.h"
class XyzImpl : public IXyz
{
public:
int Foo(int n);
void Release();
};
int XyzImpl::Foo(int n)
{
printf("Foo called....%d\n",n);
return n * n;
}
void XyzImpl::Release()
{
delete this;
}
XYZHANDLE hzfXyz()
{
printf("\n\nhzfXyz() called ....\n");
return new XyzImpl;
}
int hzf(int n)
{
printf("\n\nhzf(int) called ....\n");
XyzImpl *xyz = new XyzImpl;
return xyz->Foo(n);
}
以上编译得到 XyzLibrary.dll
minGW 代码部分:
///mian.cpp
C/C++ code
#include <stdio.h>
#include "XyzLibrary.h"
int main(int ,char** )
{
IXyz *xyz = hzfXyz();
printf(" hzfXyz call: %d\n" , xyz->Foo(5));
printf(" hzf call: %d\n" , hzf(8));
return 0;
}
////下面是输出:
hzfXyz() called ....
Foo called....169091488 /// 这里的数值应该是 5 , 却得到了 169091488
hzfXyz call: -982866944 ///这里的数值应该是 25, 却得到了 169091488 * 169091488 ,溢出....
hzf(int)
Foo called....8
hzf call: 64
问题:
在 mian 中获取 XyzImpl的指针,并调用 XyzImpl 的 Foo 函数, Foo 函数能正确调用,但是参数(上例在是 5) 却无法正确传递,而是传递了一个随机值....
我在 main 在调用 hzf(int) 函数时, 因为 XyzImpl 是在 MSVC 的 DLL 中创建的,所以函数运行结果一正确....
现在我就搞不懂, 为什么在 minGW中 的 XyzImpl 指针无法正确传递 int 这样的标准 C 类型数据呢??? 如果我要传递 STL 的数据类型, 例如 std::string, std::list 等等 ,不是更不可能了吗??
请问处理这个问题呢...望高人解答 ...谢谢!
// XyzLibrary.h
C/C++ code#ifdef XYZLIBRARY_EXPORTS
#define XYZAPI __declspec(dllexport)
#else
#define XYZAPI __declspec(dllimport)
#endif
#ifdef __cplusplus
# define EXTERN_C extern "C"
# define XYZHANDLE IXyz*
struct IXyz
{
virtual int Foo(int n) = 0;
virtual void Release() = 0;
};
#endif
EXTERN_C XYZAPI int hzf (int);
EXTERN_C XYZAPI XYZHANDLE hzfXyz (VOID);
// XyzLibrary.cpp
C/C++ code#include "stdafx.h"
#include "stdio.h"
#include "XyzLibrary.h"
class XyzImpl : public IXyz
{
public:
int Foo(int n);
void Release();
};
int XyzImpl::Foo(int n)
{
printf("Foo called....%d\n",n);
return n * n;
}
void XyzImpl::Release()
{
delete this;
}
XYZHANDLE hzfXyz()
{
printf("\n\nhzfXyz() called ....\n");
return new XyzImpl;
}
int hzf(int n)
{
printf("\n\nhzf(int) called ....\n");
XyzImpl *xyz = new XyzImpl;
return xyz->Foo(n);
}
以上编译得到 XyzLibrary.dll
minGW 代码部分:
///mian.cpp
C/C++ code
#include <stdio.h>
#include "XyzLibrary.h"
int main(int ,char** )
{
IXyz *xyz = hzfXyz();
printf(" hzfXyz call: %d\n" , xyz->Foo(5));
printf(" hzf call: %d\n" , hzf(8));
return 0;
}
////下面是输出:
hzfXyz() called ....
Foo called....169091488 /// 这里的数值应该是 5 , 却得到了 169091488
hzfXyz call: -982866944 ///这里的数值应该是 25, 却得到了 169091488 * 169091488 ,溢出....
hzf(int)
Foo called....8
hzf call: 64
问题:
在 mian 中获取 XyzImpl的指针,并调用 XyzImpl 的 Foo 函数, Foo 函数能正确调用,但是参数(上例在是 5) 却无法正确传递,而是传递了一个随机值....
我在 main 在调用 hzf(int) 函数时, 因为 XyzImpl 是在 MSVC 的 DLL 中创建的,所以函数运行结果一正确....
现在我就搞不懂, 为什么在 minGW中 的 XyzImpl 指针无法正确传递 int 这样的标准 C 类型数据呢??? 如果我要传递 STL 的数据类型, 例如 std::string, std::list 等等 ,不是更不可能了吗??
请问处理这个问题呢...望高人解答 ...谢谢!