用VC调用C写的DLL出错!

mudboy 2003-08-25 05:38:26
C的DLL我已在C下测试过,没问题,调用的原型如下:
SLogResult * getLogResult(char whereclause[300])

SLogResult * CLogPickDlg::LoadDLLGetLog(CString filter)
{
typedef UINT (CALLBACK* LPFNGETLOG)(char fi[300]);

HINSTANCE hInstance1;
LPFNGETLOG lpSquartRoot1;
hInstance1 = ::LoadLibrary("getlog.exe");
if (hInstance1 != NULL)
{

lpSquartRoot1 = (LPFNGETLOG)::GetProcAddress(hInstance1,"getLogResult");
if(!lpSquartRoot1)
{
::FreeLibrary(hInstance1);
AfxMessageBox("定位动态链接库方法出错!!!");
}
else
{
char fil[300];
const char *fil1=NULL;
fil1=(LPCTSTR)filter;
strcpy(fil,fil1);
strcat(fil,"\0");
this->p_logfromc=(SLogResult *)lpSquartRoot1(fil);//err
this->getLogFromC();

}
::FreeLibrary(hInstance1);
}
return p_logfromc;
}


但运行时总是出错(Debug error,the value of ESP was not properly saved across a function call....)
可我的参数信息没错呀,专家指导一下!·
...全文
83 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
mudboy 2003-08-29
  • 打赏
  • 举报
回复
已经得到解决,是我的DLL内存管理有问题,但是我用C调用该DLL时并没有出问题。不知道这是为什么?
mudboy 2003-08-27
  • 打赏
  • 举报
回复
我这样写可以调用过去,可是过去以后就出错了(到调用者函数的结尾处)这应该跟栈有关。
希望大家多多帮助!

void CLogPickDlg::LoadDLLGetLog(CString filter)
{


typedef SLogResult * (LPFNGETLOG)(char[]);
HINSTANCE hInstance1;
LPFNGETLOG *lpSquartRoot1;
hInstance1 = ::LoadLibrary("win32dll.dll");
if (hInstance1 != NULL)
{

lpSquartRoot1 = (LPFNGETLOG *)::GetProcAddress(hInstance1,"getLogResult");
if(!lpSquartRoot1)
{
::FreeLibrary(hInstance1);
AfxMessageBox("定位动态链接库方法出错!!!");
return;
}
else
{
CString tempstr;
char fil[300];
const char *fil1=NULL;
fil1=(LPCTSTR)filter;
strcpy(fil,fil1);
this->p_logfromc=lpSquartRoot1(fil);

while((p_logfromc[i].id!="")&&(i<MAXRESULT))
{

}
::FreeLibrary(hInstance1);
}
return;

}
Zark 2003-08-27
  • 打赏
  • 举报
回复
把这个函数
SLogResult * getLogResult(char whereclause[300]);
贴出来,同时把SLogResult的定义贴出来.
Cline 2003-08-27
  • 打赏
  • 举报
回复
谁分配的内存,就让它提供一个释放内存的函数,用完后调用之!
shaojichibang 2003-08-27
  • 打赏
  • 举报
回复
up
mudboy 2003-08-26
  • 打赏
  • 举报
回复
我另外一个方法是没有参数的,这样用不会有问题,
也就是说,问题的关键在于参数。
mudboy 2003-08-26
  • 打赏
  • 举报
回复
不行,还是出同样的错误!
njtu 2003-08-26
  • 打赏
  • 举报
回复
typedef UINT (CALLBACK* __stdcall LPFNGETLOG)(char fi[300]);

//不知行不行。

和这个问题相关大家来看看。

http://expert.csdn.net/Expert/topic/2138/2138152.xml?temp=.4941675
mudboy 2003-08-26
  • 打赏
  • 举报
回复
kingzai(kingzai)
那你说该怎么办呢?
whoo 2003-08-26
  • 打赏
  • 举报
回复
Extern "C" 函数定义
Zark 2003-08-26
  • 打赏
  • 举报
回复
这一句是不是要检查一下?

typedef UINT (CALLBACK* LPFNGETLOG)(char fi[300]);
kingzai 2003-08-25
  • 打赏
  • 举报
回复
This error is most commonly called by mixing __stdcall and
__cdecl.

In one definition, you specify __stdcall. In the other you don't,
and the function defaults to __cdecl. __stdcall and __cdecl
calling conventions have different rules regarding parameter
passing and stack cleanup. The debugger is telling you that
your code has messed up the stack.
可用来在VB,VC中驱动摄像头,进行静帧捕捉的DLL动态链接库(必须要有摄像头生成StillCap0000.bmp):将MyDll文件解压后把MyDll.dll与MyDll.lib一起拷入工程DEBUG目录中(为保险起见DEBUG的外层目录也拷贝一份吧),另有一个VC++6的测试工程test_Dll,已经考入相应DLL和LIB文件,可直接编译运行,VB只拷贝MyDll.dll与MyDll.lib VB2008 调用方法,在公共模块中声名: Public Declare Function CreateWnd Lib "MyDll" () As Double Public Declare Function ClearGraphs Lib "MyDll" () As Double Public Declare Function OnpStillCapture Lib "MyDll" (ByVal hwnd As Long) As Double Public Declare Function InitStillGraph Lib "MyDll" (ByVal hwnd As Long) As Double Public Declare Function CloseWnd Lib "MyDll" () As Double 在窗体上放置2个PictureBox控件,名字为:pic1,pic2 放置三个按键:名字为Btn1,Btn2,Btn3 Btn1为打开视频,调用代码: Private Sub Btn1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btn1.Click InitStillGraph(pic1.Handle) '打开摄像头预览视频 end sub Btn2为截取视频保存为BMP,文件保存在应用程序路径下,调用代码: Private Sub Btn2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btn2.Click OnpStillCapture(pic2.Handle) '截取预览视频一帧图像 end sub Btn3为截取视频保存为清除内存,调用代码: Private Sub Btn3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btn3.Click ClearGraphs() '退出前,完成内存清扫工 end sub VC调用方法: 在对话框上放置两个图像框,类型为位图,三个按键B1,B2,B3 定义全局函数引用: typedef HWND(* CreateWnd)(void);// typedef HRESULT(* InitStillGraph)(HWND hwnd); typedef void (* OnpStillCapture)(HWND hwnd); typedef int (* ClearGraphs)(); HINSTANCE glibsample; //如果定义成HANDLE类型,则出错 CreateWnd createwnd; InitStillGraph initStillGraph;//定义引用函数 OnpStillCapture onpStillCapture;//定义引用函数 ClearGraphs clearGraphs;//定义引用函数 用类向导为两个位图框建立控件(类型为Contorl)变量,m_p1,m_2 : 在窗口OnInitDialog()函数中调整图像框大小: // TODO: Add your specialized code here and/or call the base class m_p1.MoveWindow(0,0,200,200,true); m_p2.MoveWindow(210,0,200,200,true); glibsample=LoadLibrary("MyDll.dll"); //加载dll 在B1消息函数中: void 你的类::OnB1() { initStillGraph=(InitStillGraph)GetProcAddress(glibsample,"InitStillGraph"); (*initStillGraph)(m_p1.m_hWnd);//预览图像 } 在B2消息函数中: void 你的类::O

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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