Cannot convert 'int (__stdcall *)()' to 'int (__stdcall *)(AnsiString *)' 为什么会有这样的问题呢?

mbj 2005-05-09 10:29:16
我在头文件中有以下声明:
private:
int _stdcall (*ShowDLLForm)(AnsiString *);

然后在实现中调用
bool TMainForm::LoadDLLFun(char *DLLName,char *FunName)
{

HINSTANCE instDLL;
try{
if(instDLL!=NULL)
{
FreeLibrary(instDLL);
instDLL=NULL;

instDLL=LoadLibrary(DLLName);

if(instDLL!=NULL)
{
ShowDLLForm=GetProcAddress(instDLL,FunName);
if(ShowDLLForm==NULL)
{

Application->MessageBoxA("动态链接库运行发生错误\n","错误",MB_OK);
// ShowMessage("动态链接库运行发生错误\n");
// FreeLibrary(instDLL);
return false;
}
}
}
else
{
AnsiString AppPath=GetCurrentDir();
instDLL=LoadLibrary(DLLName);

if(instDLL!=NULL)
{
ShowDLLForm=GetProcAddress(instDLL,FunName);
if(ShowDLLForm==NULL)
{
ShowMessage("动态链接库运行发生错误\n");
// FreeLibrary(instDLL);
return false;
}
}
}
}//try
catch(Exception &Err)
{
ShowMessage("加载动态链接库发生错误!\n" + Err.Message);
}
return true;
}

但是编译的时候确给我这样的提示:
[C++ Error] Main.cpp(31): E2034 Cannot convert 'int (__stdcall *)()' to 'int (__stdcall *)(AnsiString *)'
[C++ Error] Main.cpp(49): E2034 Cannot convert 'int (__stdcall *)()' to 'int (__stdcall *)(AnsiString *)'

为什么会这样呢,请高手指点!!
...全文
277 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
mbj 2005-05-09
  • 打赏
  • 举报
回复
能解释一下为什么要用typedef吗
mbj 2005-05-09
  • 打赏
  • 举报
回复
修改两处地方:
typedef int (__stdcall *ShowDLLForm)(AnsiString *);

ShowDLLForm pfunc=(ShowDLLForm)GetProcAddress(instDLL,FunName);
————————————————————————————————

我修改后有下面提示,
[C++ Error] Main.cpp(31): E2108 Improper use of typedef 'TMainForm::ShowDLLForm'
[C++ Error] Main.cpp(32): E2108 Improper use of typedef 'TMainForm::ShowDLLForm'
[C++ Error] Main.cpp(49): E2108 Improper use of typedef 'TMainForm::ShowDLLForm'
[C++ Error] Main.cpp(50): E2108 Improper use of typedef 'TMainForm::ShowDLLForm'
yangbill 2005-05-09
  • 打赏
  • 举报
回复
学习
zhenyu362 2005-05-09
  • 打赏
  • 举报
回复
修改两处地方:
typedef int (__stdcall *ShowDLLForm)(AnsiString *);

ShowDLLForm pfunc=(ShowDLLForm)GetProcAddress(instDLL,FunName);
jixiaoqiang 2005-05-09
  • 打赏
  • 举报
回复
private:
int _stdcall (*ShowDLLForm)(AnsiString *);

改为:
  int _stdcall (*ShowDLLForm)(void);
我不懂电脑 2005-05-09
  • 打赏
  • 举报
回复
owDLLForm=GetProcAddress(instDLL,FunName);
这里有问题FunName是char *不是AnsiString *
constantine 2005-05-09
  • 打赏
  • 举报
回复
参数不对吧,
GeoPhoenix 2005-05-09
  • 打赏
  • 举报
回复
参数传递类似,定义如下
typedef void(*demo)(char *);
AnsiString DLLName = ExtractFilePath(Application->ExeName)+AnsiString("Extract.Dll");
HINSTANCE LibHandle;
LibHandle = LoadLibrary(DLLName.c_str());
if(!LibHandle)
{
ShowMessage("动态链接库加载失败!");
return ;
}
DataExtractDLL MyDLL= (DataExtractDLL)GetProcAddress(LibHandle,"ExtractData");//ExtractData函数名
if(!MyDLL)
{
ShowMessage("获取DLL入口地址失败!");
FreeLibrary(LibHandle);
return;
}
char *test="adfasdf";
MyDLL(test);
FreeLibrary(LibHandle);
//上面的例子是一个字符指针参数,其他用样,注意DLL里的定义




mbj 2005-05-09
  • 打赏
  • 举报
回复
能不能解释一下,为什么要进行类型定义呢
zhenyu362 2005-05-09
  • 打赏
  • 举报
回复
不可能的阿,要不你放到这里
bool TMainForm::LoadDLLFun(char *DLLName,char *FunName)
{
typedef int (__stdcall *ShowDLLForm)(AnsiString *);
HINSTANCE instDLL;
try{
。。。。。。。。。。
ShowDLLForm pfunc=(ShowDLLForm)GetProcAddress(instDLL,FunName);
mbj 2005-05-09
  • 打赏
  • 举报
回复
兄,我试过了,放在外面和里面结果都一样
zhenyu362 2005-05-09
  • 打赏
  • 举报
回复
[C++ Error] Main.cpp(31): E2108 Improper use of typedef 'TMainForm::ShowDLLForm'

晕,typedef int (__stdcall *ShowDLLForm)(AnsiString *);放到外面去,不要放到TMainForm声明里面
mbj 2005-05-09
  • 打赏
  • 举报
回复
我需要在调用DLL是传入一个参数,怎么办呢
GeoPhoenix 2005-05-09
  • 打赏
  • 举报
回复
我也碰到了你这样的问题,后来没有没办法不用了,我是这样修改的
在动态链接库的头文件里定义
extern "C" __export void WINAPI ExtractData(void);
在CPP里的实现
void WINAPI ExtractData(void)
{
}

调用DLL时如下定义
typedef void(*DataExtractDLL)(void);
AnsiString DLLName = ExtractFilePath(Application->ExeName)+AnsiString("Extract.Dll");
HINSTANCE LibHandle;
LibHandle = LoadLibrary(DLLName.c_str());
if(!LibHandle)
{
ShowMessage("动态链接库加载失败!");
return ;
}
DataExtractDLL MyDLL= (DataExtractDLL)GetProcAddress(LibHandle,"ExtractData");
if(!MyDLL)
{
ShowMessage("获取DLL入口地址失败!");
FreeLibrary(LibHandle);
return;
}

MyDLL();
FreeLibrary(LibHandle);
这样就不存在上述的毛病了,原来我也采取你的方法,结果昏天黑地一把也没搞好。
另外建议DLL的参数不要使用AnsiString,Borland不建议这样做,改成char *就可以了,在里面再转换。


13,822

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧