一个dll,线程,内存的问题 ( 积分: 200 )

  • 主题发起人 主题发起人 catman
  • 开始时间 开始时间
C

catman

Unregistered / Unconfirmed
GUEST, unregistred user!
情况是这样的。
一个用VC写的DLL,用Delphi写的主程序调用DLL的函数创建了一个线程,并设置了回调函数,线程采集到数据后,把数据作为参数调用主程序设的回调函数,请问主程序直接使用回调函数传过来的数据是否合法? 现在碰到的问题是大部分时间正常,但有时候程序在访问这个数据时会出问题。
 
情况是这样的。
一个用VC写的DLL,用Delphi写的主程序调用DLL的函数创建了一个线程,并设置了回调函数,线程采集到数据后,把数据作为参数调用主程序设的回调函数,请问主程序直接使用回调函数传过来的数据是否合法? 现在碰到的问题是大部分时间正常,但有时候程序在访问这个数据时会出问题。
 
你的VC写的DLL是普通的dll还是com,你船的参数是字符吗?在delphi的工程文件的uses的最前面引用 sharemem单元文件看看行不行
 
会不会是回调函数生存期过了,写一下你的回调函数。应该保存再全局变量中,最好加上互斥量。主程序使用的后半部分变量已经被修改了。
 
回调函数的参数是在DLL中申请的内存块(存放图像数据).不是string. 现在还发现,如果申请的内存块比较大的话,在主程序里直接使用这个内存指针,比如把图像数据用SetDIBitsToDevice画出来,但画不出来.如果在主程序里先申请相同大小的内存,然后把数据复制到这个内存,然后在SetDIBitsToDevice,就可以画出来.
 
原则上应该是谁申请谁释放。因为比如VC,它可以有很多种申请内存的方式。既可以使用WinAPI申请,也可以使用CRT申请,这些不同的申请方式申请到的内存的管理方式是不同的。
因此在跨语言调用的时候,最好使用系统Win32API申请的内存。
至于你的问题到底在那里,这个我想只能你自己知道。
[偶尔有问题可能就是内存生存期的问题,可能在你访问的时候,这块内存其实已经释放了,但是释放内存一般只是修改内存块的头部,因此大部分时候,仍然可以得到数据]
 
申请的内存句柄放在那里,应该在DLL的全局,或线程的循环函数里。
回调函数的参数怎么用的,写出来。
申请的内存应该在堆里,不存在上限,在栈里才有上限。
 
回调函数是由dll中的一个线程调用的,那么主线程中访问回调函数传过来的数据时应该需要临界区保护
 
to zjan521:
内存是VC写DLL申请的,具体是什么方式申请也不清楚,是调用第三方的DLL申请的。内存应该没有超出生存期,因为是在第三方的DLL的回调函数里调用我的回调函数并使用内存的。
songjungz:
内存句柄是在第三方的DLL里的,是第三方DLL的回调函数的参数,不是全局的。回调函数的参数 Callback(PBYTE pData,int nDataLen).
昨天晚上试着在自己的VC DLL里建立一个Map File,然后在第三方DLL的回调函数里把数据复制到Map File,然后在主程序里从Map File取数据,这样做是可以的。但按理所有的DLL和线程都在一个程序里,不需要用 Map File的吧。
 
pData只能在你实现(DLL只是定义,实现是你实现的)的回调函数中使用,因为该函数在回调时属于辅助线程,如果要在主线程中使用,应该COPY过来。两个线程里的公用数据应加临界区保护。
 
后退
顶部