blk5743
高階會員
發表:34 回覆:371 積分:236 註冊:2003-11-17
發送簡訊給我
|
我看了站上的文章,知道這樣的問題是跟記憶體有關係
不過我找不出來是怎麼回事,還請各位前輩幫忙
我有看各個進入點都是有值,不知道位什麼會有錯
ausb.dll是廠商提供的
此程式是從VBA改來的
//--------------------------------------------------------------------------- #include
#pragma hdrstop #include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
#define OK 0
TForm1 *Form1;
DWORD (*ausb_start)(long);
DWORD (*ausb_end)(void);
DWORD (*ausb_open)(long,long);
DWORD (*ausb_close)(long);
DWORD (*ausb_read)(long,char [],long,long);
DWORD (*ausb_write)(long,char []);
char enterF = 0;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
HMODULE lpAUSB; lpAUSB = LoadLibrary("ausb.dll");
(FARPROC &)ausb_write = GetProcAddress(lpAUSB,"ausb_write");
(FARPROC &)ausb_read = GetProcAddress(lpAUSB,"ausb_read");
(FARPROC &)ausb_start = GetProcAddress(lpAUSB,"ausb_start");
(FARPROC &)ausb_open = GetProcAddress(lpAUSB,"ausb_open");
(FARPROC &)ausb_close = GetProcAddress(lpAUSB,"ausb_close");
(FARPROC &)ausb_end = GetProcAddress(lpAUSB,"ausb_end"); }
//-------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
long OPM1, myID, ret; myID = 1; //set to No 1 //start Q8230
ret = ausb_start(10);
if ( ret == OK )
{
R1->Lines->Add("Data Open OK");
Sleep(100); //open device 1
ret = ausb_open(OPM1,myID);這裡會錯
//access violation at address 1000248E in module 'ausb.dll".
//write of address 00000000
//ausb_open在10002470
if ( ret == OK )
{
R1->Lines->Add("Device Open OK");
// Q8230(OPM1);
}
else
{
R1->Lines->Add("Device Open Error");
} //close device 1
ret = ausb_close(OPM1);
if ( ret != OK )
{
R1->Lines->Add("Device Close Error");
}
R1->Lines->Add("Device Close OK");
}
else
{//start fail
R1->Lines->Add("Data Open Error");
} //end Q8230
ret = ausb_end();
if ( ret != OK )
{
R1->Lines->Add("Device End Error");
}
else
R1->Lines->Add("Device End OK");
}
|
GeorgeKu
中階會員
發表:1 回覆:120 積分:74 註冊:2004-10-13
發送簡訊給我
|
妳的OPM1好像沒給初值,看看問題是不是出在那裡.
|
blk5743
高階會員
發表:34 回覆:371 積分:236 註冊:2003-11-17
發送簡訊給我
|
引言:
妳的OPM1好像沒給初值,看看問題是不是出在那裡.
我有給OPM1初值了(0 or ..),但還是不行 我看說明書上的說明
asub_open(lnghDev, lngMyid)
input lngMyid: [long] device ID 0~127
output lnghDev: [long] handle value 這程式在VBA能跑,沒有問題
我看到OPM1得到的是Handle值,我也試過把她宣告為HWND
可是也沒用,不知道該如何解決
|
blk5743
高階會員
發表:34 回覆:371 積分:236 註冊:2003-11-17
發送簡訊給我
|
不好意思,是我白目,回完GeorgeKu大大的提示才發現問題
以下兩個地方做修改就好了 DWORD (*ausb_open)(long *,long);
ret = ausb_open(&OPM1,myID); 不過在Richedit上作顯示字串,一樣會有
Access Violation at address 00401D20 in module aaa.exe.
Read of address 8BF445FF.Process stopped. Use Step or Run to continue.
不知道是為什麼,難道會相衝
|
GeorgeKu
中階會員
發表:1 回覆:120 積分:74 註冊:2004-10-13
發送簡訊給我
|
我剛剛才想問說你是不是ausb_open宣告錯了,lnghDev是OUTPUT怎會用傳值的方式,剛剛REFRESH一下網頁看到你已經發現嚕,我想原形是不是宣告為傳參考
DWORD (*ausb_open)(long &,long);
ret = ausb_open(OPM1,myID);
試試看吧
|
blk5743
高階會員
發表:34 回覆:371 積分:236 註冊:2003-11-17
發送簡訊給我
|
感謝 控制儀器已經沒問題了
不過在RichEdit, Memo, Edit上顯示字串還是會有問題
|