讨教:
// iTween.cpp : 定义 DLL 应用程序的导出函数。
#ifdef ITWEEN_EXPORTS
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif
int groupID = 0xC154;
char dogOnlyId[30] = “314A990D1A6E4D0F”;
extern “C” DLL_API int ReadGroupID()
{
return groupID;
}
extern “C” DLL_API void ReadDogOnlyId(char *getDogOnlyId)
{
getDogOnlyId = dogOnlyId;
}
编译为 iTween.dll
// Test1.cpp : 定义 DLL 应用程序的导出函数。
#ifdef TEST1_EXPORTS
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif
int groupID = 0xC153; //分组号
char dogOnlyId[64] = “314A990D1A60F”;
// iTween.cpp : 定义 DLL 应用程序的导出函数。
#ifdef ITWEEN_EXPORTS
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif
int groupID = 0xC154;
char dogOnlyId[30] = “314A990D1A6E4D0F”;
extern “C” DLL_API int ReadGroupID()
{
return groupID;
}
extern “C” DLL_API void ReadDogOnlyId(char *getDogOnlyId)
{
getDogOnlyId = dogOnlyId;
}
编译为 iTween.dll
// Test1.cpp : 定义 DLL 应用程序的导出函数。
#ifdef TEST1_EXPORTS
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif
int groupID = 0xC153; //分组号
char dogOnlyId[64] = “314A990D1A60F”;
extern “C” DLL_API int readNumber()
{
HINSTANCE hDllInst = LoadLibrary(“iTween.dll”);
typedef int (WINAPI *FunReadGroupID)();
typedef void (WINAPI *FunReadDogOnlyId)(char *);
FunReadGroupID MyReadGroupID = NULL; //函数别名
FunReadDogOnlyId MyReadDogOnlyId = NULL;
MyReadGroupID = (FunReadGroupID)GetProcAddress (hDllInst, “ReadGroupID”);
MyReadDogOnlyId = (FunReadDogOnlyId)GetProcAddress (hDllInst, “ReadDogOnlyId”);
if(MyReadGroupID)
{
groupID = MyReadGroupID();
}
if(MyReadDogOnlyId)
{
MyReadDogOnlyId(dogOnlyId);
}
FreeLibrary(hDllInst);
}
编译为 Test1.dll
现在情况是,本人在别的程序调用 Test1.dll 的 readNumber()
当执行 MyReadDogOnlyId(dogOnlyId);
dogOnlyId 得不到正确的值
本人哪里错了啊?
谢谢!
解决方案
45
错误不在能否使用WINAPI,而在你dll中的函数ReadDogOnlyId(),你的实现中是直接将参数指向了dll中全局变量地址,这种方法本身就是不可取的,使用dll时要避免跨dll内存管理,即dll和程序应分别管理本人的内存,避免指针相互传递导致释放错误等引起Crash。
回到这里,可以使用如下代码传递值,这里写死了长度为30,可自行调整;当然也可以extern全局变量。
回到这里,可以使用如下代码传递值,这里写死了长度为30,可自行调整;当然也可以extern全局变量。
extern "C" DLL_API void ReadDogOnlyId(char *getDogOnlyId) { //getDogOnlyId = dogOnlyId; strncpy(getDogOnlyId, dogOnlyId, 30); }
15
先搜一个成熟完整的DLL例子参考之。
15
看看字符串的赋值及拷贝
50
你的ReadDogOnlyId中的参数是按值传递的,你在函数中修改的只是实参的一个复制品,不会影响到实参