我在调用c写的dll程序时,退出程序时总是告诉我‘无效的指针操作’,请予解决(100分)

  • 主题发起人 主题发起人 vbfgm
  • 开始时间 开始时间
V

vbfgm

Unregistered / Unconfirmed
GUEST, unregistred user!
c++源程序如下
LONG OnStkDataOK(UINT wParam,LONG lParam)
{
RCV_DATA * pHeader;//类型说明
.....
pHeader = (RCV_DATA *)lParam;
.....
}


其中RCV_DATA数据类型定义如下
typedef struct tagRCV_DATA
{
int m_wDataType; // 文件类型
int m_nPacketNum; // 记录数,参见注一
RCV_FILE_HEADEx m_File; // 文件接口(结构类型)
BOOL m_bDISK; // 文件是否已存盘的文件
union //以下均是结构指针类型
{
RCV_REPORT_STRUCTEx * m_pReport;
RCV_REPORT_STRUCTEx1 * m_pReport1;
RCV_HISTORY_STRUCTEx * m_pDay;
RCV_MINUTE_STRUCTEx * m_pMinute;
RCV_POWER_STRUCTEx * m_pPower;
void * m_pData; //
};
} RCV_DATA,*PRCV_DATA;

以上我翻译成delphi程序如下
RCV_DAta结构定义如下
JET_RCV_DATA=record
m_wDataType:integer; // 文件类型
m_nPacketNum:integer; // 记录数,参见注一
m_File:JET_RCV_FILE_HEADEx; // 文件接口(记录类型)
m_bDISK:boolean; // 文件是否已存盘的文件
case integer of
0:(m_pReport:PJET_RCV_REPORT_STRUCTEx);
1:(m_pReport1:PJET_RCV_REPORT_STRUCTEx1);
2:(m_pDay:PJET_RCV_HISTORY_STRUCTEx);
3:(m_pMinute:PJET_RCV_MINUTE_STRUCTEx);
4:(m_pPower:PJET_RCV_POWER_STRUCTEx);
5:(m_pData:pointer); //
end;
PJET_RCV_DATA=^JET_RCV_DATA;//结构指针

源程序翻译如下
procedure TStockForm.OnStkDataOK(var Msg: TMessage); //Jet消息处理
var i,j:integer; stkdata:PJET_RCV_DATA;
begin
new(stkdata);
label1.Caption:=inttohex(msg.WParam,0)+','+inttohex(msg.LParam,0);
stkdata:=ptr(msg.LParam); //msg.LParam指向结构指针
.........
dispose(stkdata);
end;

以上程序运行没问题,就是在退出时总是显示‘invalid pointer operation’错误
尤其是‘stkdata:=ptr(msg.LParam);’这个语句,只要没他就不会出现上述错误,可是没他不成呀
请高手解决
 
究竟是调用DLL有问题
还是翻译后有问题
 
你为什么要dispose(stkdata),在exe中的指针在dll中释放,很可能会出问题的!
况且,结构(Record)的生存期是自管理的
 
xiammy 说对了! 这个指针你可以引用他,但不能释放他. 这是DLL的一个规则
procedure TStockForm.OnStkDataOK(var Msg: TMessage); //Jet消息处理
var i,j:integer; stkdata:PJET_RCV_DATA;
begin
//new(stkdata);{去掉}
label1.Caption:=inttohex(msg.WParam,0)+','+inttohex(msg.LParam,0);
stkdata:=ptr(msg.LParam); //msg.LParam指向结构指针
.........
//dispose(stkdata);{去掉}
end;
 
我也不知道是翻译有问题还是调用有问题,我按照你们说的,new(stkdata);{去掉},dispose(stkdata);{去掉}
依然在关闭程序后显示‘无效的指针操作’。打开界面无问题,运行也无问题,就是关闭程序后弹出这个对话框
 
如果脱离delphi控制台运行已编译的程序,显示'runtime error 217 at 00402AE8'错误
 
C++ 没有给出释放指针的接口吗??
 
没有,这个程序是一个股票数据接收接口,我编写的的程序是接收这个接口的数据,
我编写的这个程序原理是这样的、:1。加载接口的DLL,dll自动调出其exe窗体。2,dll程序通过事件返回数据结构指针,通过这个指针调用其中的数据
 
new (stkdata);
stkdata:=ptr(msg.LParam); //msg.LParam指向结构指针
1.这句话换成指针拷贝,把msg.LParam指针的内容复制到stkdata中来!!!
copymemory(stkdata,ptr(msg.lparam),sizeof(TET_RCV_DATA));
具体的可以参见DELPHI中的copymemory.
2.再有就是参数调用的转换方式,stdcall,cdecl等等clearup是不同的,你可以参看具体的说明
3.你的结构中还有指针,这些指针有没有赋值,而且在最后有没有释放呢?
 
谢谢,我已找到问题所在,用ShareMemRep.pas替换sharemem单元就行了,感谢ShareMemRep的作者
 
接受答案了.
 
后退
顶部