老问题,vc里面回调函数的参数是个结构体,下面这样
struct B2B_API B2B_SpotRate
{
char szID[33];
char szRateName[7];
long lValueDate;
double dblBid;
double dblAsk;
long lBidLimit;
long lAskLimit;
char szLimitCcy[4];
BOOL fTradable;
int nTicksize;
int nDisplayDecs;
long lTimestamp;
long lServerTimestamp;
};
在vb写回调函数时,那个对应的结构体不会写(主要是char数组那里搞不定),
另外想问一下,我在vb的ide运行程序完毕后,总有些资源没有释放掉的样子,
第二次运行该程序结果不一样,要退出ide再进入才正常,有什么方法解决?
struct B2B_API B2B_SpotRate
{
char szID[33];
char szRateName[7];
long lValueDate;
double dblBid;
double dblAsk;
long lBidLimit;
long lAskLimit;
char szLimitCcy[4];
BOOL fTradable;
int nTicksize;
int nDisplayDecs;
long lTimestamp;
long lServerTimestamp;
};
在vb写回调函数时,那个对应的结构体不会写(主要是char数组那里搞不定),
另外想问一下,我在vb的ide运行程序完毕后,总有些资源没有释放掉的样子,
第二次运行该程序结果不一样,要退出ide再进入才正常,有什么方法解决?
解决方案 »
- 求助:同样一段小程序,作为VBA放在excel中和VB程序中单独使用速度相差很大
- vb6 调用 FUNCTION string MDString(string arg1,int arg2) Library "md5.dll " 问题
- 如何用VB ActiveX编写条形码控件
- 在一个窗体中定义的dim变量与private变量有区别吗?区别在何处?
- 急```急```急````急```快来救救小弟的命啊`!~!~!~!~!~
- DataGrid的简单问题请教!
- ======遇到大问题了。关于winsock,请高手给个思路 (100)======
- adox创建数据库???急
- 求助ado中connectinostring的问提
- 怎么让timer控件准时一点,他计算的时间差很多
- 请教关于内外与外网通信问题.
- 如何在我写的软件中实现当程序关闭时,用户如上网,会在后台将'错误收集库'发送到我的邮箱,使我能收集测试错误信息
type B2B_API B2B_SpotRate
'{
' char szID[33];
szID(32&) as byte
' char szRateName[7];
szRateName(6&) as byte
' long lValueDate;
lValueDate as long
' double dblBid;
dblBid as double
' double dblAsk;
dblAsk as double
' long lBidLimit;
lBidLimit as long
' long lAskLimit;
lAskLimit as long
' char szLimitCcy[4];
szLimitCcy(3&) as byte
' BOOL fTradable;
fTradable as long
' int nTicksize;
nTicksize as long
' int nDisplayDecs;
nDisplayDecs as long
' long lTimestamp;
lTimestamp as long
' long lServerTimestamp;
lServerTimestamp as long
'};
end type
Dim rate As b2b_spotrate
CopyMemory ByVal VarPtr(rate), ByVal lpTyp, Len(rate)
不过老是回出现读内存错误(运行exe的情况下)
另外,我vc上struct的修饰B2B_API是__declspec(dllexport)的意思,
跟这个有没有关系呢
IsBadPtr或者直接lpTyp<>0我碰到好几个朋友都是因为调用约定的问题而出现了莫名其妙的访问违规错误,你也检查一下函数的调用约定看
struct B2B_API B2B_SpotRate,
也就是
struct __declspec(dllexport) B2B_SpotRate
这个我把修饰的B2B_API去掉后也出错,换用__stdcall出了一大堆错,没辙了
但是生成Exe运行就出现地址访问错,在vb跟踪callback函数也不行,IDE直接关闭并弹出访问
内存错,救命啊
已经是编译成exe,然后在vc环境下调试了,情况是每次走到回调函数那步就报access violation 的错误出来,估计就是在回调函数里面的copymemory出错了,我的copymemory
这样声明
Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
to pigpag
除了copymemory外,其他dll里面的函数,如果有参数的话都是是用byval修饰的,
帮忙看看好么:
6A29DB58 test byte ptr [eax+76h],2
6A29DB5C mov esi,dword ptr [ebp+0Ch]
6A29DB5F jne 6A2C590E
6A29DB65 mov eax,dword ptr [ebp+8]
6A29DB68 xor edi,edi
6A29DB6A cmp eax,edi
6A29DB6C mov dword ptr [ebp+0Ch],eax
6A29DB6F jl 6A2C5922
6A29DB75 pop edi
6A29DB76 pop esi
6A29DB77 pop ebx
6A29DB78 leave
6A29DB79 ret 8
以上是其中一段,出错是在MSVBVM60.DLL
里面写的语句看来看去最有可能在 mov dword ptr [ebp+0Ch],eax上出问题,就是把eax的值赋给第2个参数,也就是[ebp+0Ch],你察看一下,是不是有什么应该传个变量来接受值的时候却传了个什么数字进去
6A29DB5C mov esi,dword ptr [ebp+0Ch]
如何跟踪
to supergreenbean
我看了一下dll的编译参数,是使用/MD参数的,这是否表示该dll是多线程的,另外,为什么
vb调用多线程dll会出问题
The thread 0x82C has exited with code 0 (0x0).
The thread 0x84C has exited with code 0 (0x0).
The thread 0x82C has exited with code 0 (0x0).
The thread 0x84C has exited with code 0 (0x0).
The thread 0x7A8 has exited with code 0 (0x0).
这样的信息,这个dll应该是多线程的
6A29DB52 call dword ptr ds:[6A2810B8h]
就是这句,你能说清楚一点么,是dll程序修改还是vb程序修改
__vbaNew2 - New 语句时调用,
__vbaCastObj - 对对象赋值时调用,
__vbaRedim - ReDim 语句时调用,
__vbaSetSystemError - 调用以 Declare 语句声明的函数(API)后调用由此可见,在你的VB程序中,当回调函数在非主线程的上下文里调用完 CopyMemory 以后,立即会调用__vbaSetSystemError函数,而__vbaSetSystemError函数会调用以上出错的代码,接而产生AV错误。这也是 vb 多线程程序通常产生错误的原因所在。如果要解决此问题的话,可以把每一个线程里相对应的线程本地存储值都换成和主线程一样的,或者可以让vb程序在调用完api后不调用__vbaSetSystemError函数,或者可以让 dll 在主线程的上下文里调用回调函数,也可以避免使用 api 和其他一些可能调用以上运行库函数的代码。以上只是我的一些研究成果 :),希望各位补充和指正。
CopyMemory ByVal VarPtr(rate), ByVal lpTyp, Len(rate)如果用默认的声明:Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
就这样写:CopyMemory rate, ByVal lpTyp, Len(rate)如果用修改的申明:Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Dest As Long, ByVal Src As Long, ByVal Length As Long)
就这样写:CopyMemory VarPtr(rate), lpTyp, Len(rate)
这样就不会错啦