線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1200
推到 Plurk!
推到 Facebook!

Access Violation at....

尚未結案
blk5743
高階會員


發表:34
回覆:371
積分:236
註冊:2003-11-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-02-02 21:15:34 IP:61.66.xxx.xxx 未訂閱
我看了站上的文章,知道這樣的問題是跟記憶體有關係 不過我找不出來是怎麼回事,還請各位前輩幫忙 我有看各個進入點都是有值,不知道位什麼會有錯 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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-02-03 09:16:33 IP:61.228.xxx.xxx 未訂閱
妳的OPM1好像沒給初值,看看問題是不是出在那裡.
blk5743
高階會員


發表:34
回覆:371
積分:236
註冊:2003-11-17

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-02-03 09:41:28 IP:61.66.xxx.xxx 未訂閱
引言: 妳的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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-02-03 10:15:01 IP:61.66.xxx.xxx 未訂閱
不好意思,是我白目,回完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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-02-03 10:32:41 IP:61.228.xxx.xxx 未訂閱
我剛剛才想問說你是不是ausb_open宣告錯了,lnghDev是OUTPUT怎會用傳值的方式,剛剛REFRESH一下網頁看到你已經發現嚕,我想原形是不是宣告為傳參考 DWORD (*ausb_open)(long &,long); ret = ausb_open(OPM1,myID); 試試看吧
blk5743
高階會員


發表:34
回覆:371
積分:236
註冊:2003-11-17

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-02-03 14:25:16 IP:61.66.xxx.xxx 未訂閱
感謝 控制儀器已經沒問題了 不過在RichEdit, Memo, Edit上顯示字串還是會有問題
系統時間:2024-05-19 19:56:05
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!