• 欢迎访问,如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

求帮助:本人的 dll 中的字符串数组调用总是得不到正确的值,请帮本人看看啊,谢谢

C++语言 码拜 3年前 (2017-04-21) 193次浏览
讨教:
// 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全局变量。

extern "C" DLL_API void ReadDogOnlyId(char *getDogOnlyId)
{
	//getDogOnlyId = dogOnlyId;
	strncpy(getDogOnlyId, dogOnlyId, 30);
}

15

先搜一个成熟完整的DLL例子参考之。

15

看看字符串的赋值及拷贝

50

你的ReadDogOnlyId中的参数是按值传递的,你在函数中修改的只是实参的一个复制品,不会影响到实参

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明求帮助:本人的 dll 中的字符串数组调用总是得不到正确的值,请帮本人看看啊,谢谢
喜欢 (0)
[1034331897@qq.com]
分享 (0)