천객만래 [千客萬來] (It has an interminable succession of visitors)


wininet.dll 를 이용한 ftp 방법이네요

자료실에 적지 않은 소스가 올라와 있지만

wininet.dll를 이용하여 한눈에 볼수 있게 올리셨으니

더 많이 이용할 것 같네요

고맙습니다 ^^


//먼저 global external function에서 선언하시고
 
FUNCTION ULONG InternetConnectA (ULONG hInternetSession, STRING sServerName, INT nServerPort, STRING sUsername, STRING sPassword, ULONG lService, ULONG lFlags, ULONG lContext) LIBRARY "wininet.dll"
FUNCTION ULONG InternetOpenA (STRING sAgent, LONG lAccessTyp, STRING sProxyNam, STRING sProxyBypass, ULONG lFlags) LIBRARY "wininet.dll"
FUNCTION ULONG InternetCloseHandle (ULONG hInet) LIBRARY "wininet.dll"
FUNCTION ULONG FtpOpenFileA (ULONG hFtpSession, STRING sBuff, ULONG Access, ULONG FLAGS, ULONG Context) LIBRARY "wininet.dll"
FUNCTION ULONG FtpGetFileSize (ULONG hFile, ULONG lpdwFileSizeHigh) LIBRARY "wininet.dll"
FUNCTION ULONG InternetReadFile (ULONG hFile, REF BLOB sBuffer, ULONG lNumBytesToRead, REF LONG dwNumberOfBytesRead) LIBRARY "wininet.dll" 
FUNCTION ULONG InternetWriteFile (ULONG hFile, REF BLOB sBuffer, ULONG lNumBytesToWrite, REF LONG dwNumberOfBytesWritten) LIBRARY "wininet.dll"

 
//다음 global variable에서 선언하세요
 
CONSTANT LONG ERROR_NO_MORE_FILES = 18
CONSTANT LONG BUFFERSIZE = 255
CONSTANT LONG INTERNET_FLAG_PASSIVE = 134217728
CONSTANT LONG FTP_TRANSFER_TYPE_BINARY = 2
CONSTANT LONG FTP_TRANSFER_TYPE_ASCII = 1
CONSTANT LONG GENERIC_READ = 2147483648
CONSTANT LONG GENERIC_WRITE = 1073741824
CONSTANT LONG INTERNET_OPEN_TYPE_PRECONFIG = 0
CONSTANT LONG INTERNET_SERVICE_FTP = 1
 
CONSTANT STRING IP="210.91.117.9"
CONSTANT INT PORT=3001
CONSTANT STRING ID="CHEIL"
CONSTANT STRING PW="NBS"
 
CONSTANT STRING CONNECTS="PASSIVE"
CONSTANT STRING TRANSFER="BINARY"
CONSTANT STRING SERVER="/"
 
CONSTANT STRING PATH="c:\erp"
CONSTANT STRING DEVICE="c:"
 
LONG GL_HOPEN, GL_HCONNECTION, GL_HFILE, GL_DWTYPE, GL_DWSEMAN
STRING GS_SYSID, GS_PGID, GS_EXT, GS_VER
 
BOOLEAN GB_CYCLE = TRUE 
 
//다음 화일 다운로드(업로드)시에 아래의 3개의 함수를 사용하세요
//호출시 FTP를 OPEN합니다
FTPOPEN(IP, PORT, ID, PW)
 
//다운로드 받습니다
FTPDOWNLOAD("c:\a.txt", "/a.txt", 1000)
 
//FTP를 종료합니다
FTPCLOSE()

 
//아래는 FTPOPEN함수 부분입니다
//4개인 인수가 있는데 순서대로 string,integer,string,string type 입니다

TRY
 IF GL_HCONNECTION < 0 THEN INTERNETCLOSEHANDLE(GL_HCONNECTION)
 
 YIELD()
 GL_HOPEN = INTERNETOPENA("FTP MODULE",INTERNET_OPEN_TYPE_PRECONFIG, ' ', ' ', 0)
 GL_HCONNECTION = INTERNETCONNECTA(GL_HOPEN,IPS,PORTS,USER,PASSWORD,INTERNET_SERVICE_FTP,GL_DWSEMAN,0)
CATCH (RUNTIMEERROR RE)
 SLE_4.TEXT = "FTP 연결오류"
END TRY
 
IF GL_HCONNECTION < 0 THEN RETURN TRUE
 
//아래는 FTPDOWNLOAD 부분입니다
//3개의 인수가 있는데 순서대로 string,string,integer 입니다

BLOB LB_DATA
LONG LL_SUM, LL_BLOCK, LL_DWREAD
INT LI_FILENUM
 
YIELD()
 
TRY
 IF NOT ISNULL(LOCAL) AND NOT ISNULL(REMOTE) THEN
 GL_HFILE = FTPOPENFILEA(GL_HCONNECTION, REMOTE, GENERIC_READ, GL_DWTYPE,0)
 
 IF GL_HFILE =0 THEN
 SLE_4.TEXT = "FTP 화일열기 실패 : " + GS_PGID
 RETURN FALSE
 END IF
 
 SIZE = FTPGETFILESIZE(GL_HFILE,0)
 IF SIZE <= 0 THEN RETURN FALSE
 
 HPB_1.Maxposition = INT(SIZE / BUFFERSIZE)
 LL_SUM = 0
 
 YIELD()
 
 LI_FILENUM = FILEOPEN(LOCAL, STREAMMODE!, WRITE!, LOCKWRITE!, REPLACE!)
 FILESEEK(LI_FILENUM, 0, FROMBEGINNING!)
 
 FOR LL_BLOCK = 1 TO INT(SIZE / BUFFERSIZE)
 YIELD()
 
 LB_DATA = BLOB(SPACE(BUFFERSIZE))
 IF INTERNETREADFILE(GL_HFILE,LB_DATA,BUFFERSIZE,LL_DWREAD) = 0 THEN
 SLE_4.TEXT = "FTP 화일읽기 실패 : " + GS_PGID
 RETURN FALSE
 END IF
 
 FILEWRITE(LI_FILENUM, LB_DATA)
 
 LL_SUM += BUFFERSIZE
 HPB_1.POSITION = INT(LL_SUM / BUFFERSIZE)
 NEXT
 END IF
 
 LB_DATA = BLOB(SPACE(MOD(SIZE,BUFFERSIZE)))
 IF INTERNETREADFILE(GL_HFILE,LB_DATA,MOD(SIZE,BUFFERSIZE),LL_DWREAD) = 0 THEN SLE_4.TEXT = "FTP 화일읽기 실패 : " + GS_PGID
 
 FILEWRITE(LI_FILENUM, LB_DATA)
 HPB_1.POSITION = HPB_1.MAXPOSITION
 
 YIELD()
 
 INTERNETCLOSEHANDLE(GL_HFILE)
CATCH (RUNTIMEERROR RE)
 SLE_4.TEXT = "FTP 화일전송 실패 : " + GS_PGID + GS_EXT
END TRY
 
FILECHECK()
SLE_3.TEXT = "전송화일 : " + GS_PGID + GS_EXT
RETURN TRUE 

 
//여기서 ftpgetfile 함수를 사용하지 않고 internetreadfile 함수를
//사용한 이유는 프로그래스바에서 진행상황을 나타내기 위함입니다
 
//마지막으로 FTPCLOSE 함수부분입니다
 
IF GL_HCONNECTION < 0 THEN INTERNETCLOSEHANDLE(GL_HCONNECTION)
GL_HCONNECTION = 0 
 

이정도만 하면 완변하게 구현이 되는데 single text 나 프로그래스바
컨트롤은 설치하신후에 프로그램해야 오류가 안난다는것은 말할 필요가
없겠죠..

출처: http://www.pbdn.net/board/BoardShow.aspx?board_id=2&role=qna&page=4&c_id=7663&c_seq=5&sfield=total&svalue=wininet
고맙게 잘 봤습니다.

추가... 직접 작성한 화일 업로드 루틴 추가



//아래는 FTPUPLOAD 부분입니다
//2개의 인수가 있는데 순서대로 string,string입니다
BLOB LB_DATA
LONG LL_SUM, LL_BLOCK, LL_DWWRITE , LL_SIZE
INT LI_FILENUM
 
YIELD()
 
TRY
 IF NOT ISNULL(a_local) AND NOT ISNULL(a_remote) THEN
  GL_HFILE = FTPOPENFILEA(GL_HCONNECTION, a_remote, GENERIC_WRITE, GL_DWTYPE,0)
 
  IF GL_HFILE =0 THEN
   MessageBox('FTP', "FTP 화일쓰기 실패 1: " + GS_PGID )
   RETURN FALSE
  END IF
  
  //a_SIZE = FTPGETFILESIZE(GL_HFILE,0)
  LL_SIZE = FileLength(a_local)
  IF LL_SIZE <= 0 THEN
   RETURN FALSE
  END IF
  //HPB_1.Maxposition = INT(SIZE / BUFFERSIZE)
  LL_SUM = 0
  
  YIELD()
  
  LI_FILENUM = FILEOPEN(a_LOCAL, STREAMMODE!, READ!, LOCKWRITE!, REPLACE!)
  FILESEEK(LI_FILENUM, 0, FROMBEGINNING!)
  
  FOR LL_BLOCK = 1 TO INT(LL_SIZE / BUFFERSIZE)
   YIELD()
   
   LB_DATA = BLOB(SPACE(BUFFERSIZE))
   IF INTERNETWRITEFILE(GL_HFILE,LB_DATA,BUFFERSIZE,LL_DWWRITE) = 0 THEN
    MessageBox('FTP', "FTP 화일쓰기 실패 2: " + GS_PGID )
    RETURN FALSE
   END IF
   
   FILEREAD(LI_FILENUM, LB_DATA)
   
   LL_SUM += BUFFERSIZE
   //HPB_1.POSITION = INT(LL_SUM / BUFFERSIZE)
  NEXT
 END IF
 
 FILEREAD(LI_FILENUM, LB_DATA)
 
 //LB_DATA = BLOB(SPACE(MOD(LL_SIZE,BUFFERSIZE)))
 IF INTERNETWRITEFILE(GL_HFILE,LB_DATA,MOD(LL_SIZE,BUFFERSIZE),LL_DWWRITE) = 0 THEN
  MessageBox('FTP', "FTP 화일쓰기 실패 3: " + GS_PGID )
 END IF 
 //FILEWRITE(LI_FILENUM, LB_DATA)
 //HPB_1.POSITION = HPB_1.MAXPOSITION

 YIELD()

 INTERNETCLOSEHANDLE(GL_HFILE)

CATCH (RUNTIMEERROR RE)
 MessageBox('FTP', "FTP 화일보내기 실패 4: " + GS_PGID + GS_EXT )
END TRY
 
//FILECHECK()
MessageBox('FTP', "보내는화일 : " + GS_PGID + GS_EXT )
RETURN TRUE 
 

Posted by SB패밀리


파워빌더 11.5 버전 테스트


FTP서버에 파일을 Upload, Download, Delete, 목록가져오기 등을 구현하는 예제입니다.

해당 Zip파일을 풀면 ftp.dll과 이 dll을 파워빌더에서 API로 사용하는 방법이 설명되어 있는 파일, 그리고 이를 구현한 PB n.v.o가 PBL에 있습니다.

ftp.dll은 system32폴더 또는 파워빌더 실행파일이 있는 위치에 두시면
됩니다.


[ftp1.pbl]
------------------------------------------------------------------------
// FTP
n_ftp in_ftp

// FTP UPload

string is_server, is_user, is_pass, is_serverfilename, is_clientfilename


is_server = a_server
is_user = a_user
is_pass = a_pass
is_serverfilename = a_serverfilename
is_clientfilename = a_clientfilename

    // 1. FTP object 생성
    in_ftp    = create n_ftp 

    // 2. FTP Connect
    Int li_i
    li_i = in_ftp.FTPConnect(is_server, is_user, is_pass)

    if li_i <> 0 then
       MessageBox("오류", "FTP Server에 접속중 오류가 발생했습니다.", Exclamation!)
       destroy in_ftp
       return
    end if

    // 3. FTP Transfer
    Int li_rtn
    string s_server_file, s_client_file
    s_server_file = is_serverfilename //"c:\\test.txt"
    s_client_file = is_clientfilename //"/tmp/test"

    // 송신 put
    li_rtn = in_ftp.FTPputFile(s_client_file, s_server_file, 0)

   
    /* -ftp의 사용법------------------------------------------------------------
    FTPgetCurrentDir ( return string(blob) ) 
    FTPsetCurrentDirUp ()
    FTPsetCurrentDir ( "디렉토리")
    FTPfileList ( return string(blob) )
    FTPgetFile ( String REMOTE_FILE, String LOCAL_FILE, integer BINARY_OR_TEXT )
    FTPcreateDir ( String NEW_DIR )
    FTPdeleteFile ( String DEL_FILE )
    FTPdeleteDir ( String DEL_DIR )
    FTPrenameDir ( String CURR_DIR, String NEW_DIR )
    FTPputFile ( String LOCAL_FILE, String REMOTE_FILE, integer BINARY_OR_TEXT )
    FTPping ( String IPaddress )
    ------------------------------------------------------------------------- */   

    if li_rtn = 0 then
       //Transfer Success..
        MessageBox("안내", "파일전송 성공!")
    else
       //Transfer Failure..
       MessageBox("안내", "파일전송 실패!")
       return
    end if

    // 4. FTP Disconnect
    Int li_rtn2
    li_rtn2 = in_ftp.FTPDisconnect()
    if li_rtn2 <> 0 then
       MessageBox("오류", "FTP Disconnect를 하는 중에 오류가 발생했습니다.", Exclamation!)
       destroy in_ftp
       return
    end if

    // 5. FTP Close
    destroy in_ftp

------------------------------------------------------------------------------------------

출처 : 구글 검색
고맙게 잘 봤습니다.

Posted by SB패밀리

이벤트에서 트랩될 수 있는 시스템 에러

Error.Number

Error.Text

1

0으로 나눔

2

참조할 오브젝트가 Null 임

3

배열의 영역이 초과됨

4

열거된 값이 함수의 범위를 벗어남

5

함수에서 음수값을 반환함

6

지정된 행/열에 데이터윈도우가 맞지 않음

7

외부 연결을 참조할 때 해결되지 않은 문제가 있음

8

널 스크립트를 가진 배열을 참조함

9

현재 애플리케이션에 DLL함수가 없음

10

DLL함수에 지원되지 않는 인자형이 있음

12

GetItem형과 DataWindow의 열 타입이 맞지 않음

13

속성 참조를 해결하지 못함

14

외부 함수에서 DLL 라이브러리를 열 때 에러 발생

15

외부 함수를 호출할 때 에러 발생

16

최대 스트링 크기를 초과함

17

D/W 오브젝트에서 참조한 데이터윈도우가 존재하지 않음

18

함수가 변환값을 갖지 않음

19

변수에서 이름을 바꿀 수 없음

20

데이터베이스 명령어가 성공적으로 준비되지 않았음

21

파일 참조 실행시간 에러

22

오브젝트 타입이 틀림

23

오브젝트의 타입이름을 변수의 타입이름으로 표시할 수 없음

24

함수 호출이 정의와 맞지 않음

25

Double형이나 실수형의 표현이 오버플로우됨

26

필드 이름 지정을 지원하지 않음

27

정수의 제곱에 음수를 가질수 없음

28

VBX에러 : 이름

30

외부오브젝트 테이터 타입의 이름을 지원하지 않음

31

지원되지 않는 외부 오브젝트 데이터형의 이름

32

외부 함수 호출시 이름을 찾을 수 없음

33

외부 오브젝트 함수 호출시 인자형이 맞지 않음

34

외부 오브젝트 함수 호출시 인자의 개수가 맞지 않음

35

외부 오브젝트 속성의 호출시 에러

36

외부 오브젝트 속성을 접근하는데 찾는 이름이 없음

37

외부 오브젝트 속성을 접근하는데 타입이 맞지 않음

38

외부 오브젝트 속성을 접근하는데 하위스크립트의 수가 부정확함

39

외부 오브젝트 속성을 접근하는데 에러 발생

40

자료형이 맞지 않음

41

문법에 맞지 않는 이상한 자료형이 있음

42

DLL 함수를 호출하는데 지정한 인자형과 필요한 인자형이 다름


애플리케이션 종료 에러

Error.Number

Error.Text

50

애플리케이션 참조를 해결할 수 없다

51

동적 라이브러리를 로드 하는데 실패

52

조상 오브젝트의 이름이 빠짐

53

이름에서 조상 오브젝트의 이름이 빠짐

54

이름에서 조상 오브젝트의 이름과 이름이 충돌함

55

요청된 함수를 수행하던 중에 윈도우 닫음 발생

56

데이터베이스 인터페이스가 원격 프로시저 호출을 지원하지 않음

57

데이터베이스 인터페이스가 배열함수(함수이름)를 지원하지 않음

58

이름을 위한 BLOB변수가 비었음

59

최대 길이를 초과

[출처] [펌] 에러코드|작성자 구우

Posted by SB패밀리
데이타윈도우 내용을 엑셀로 내려받기
 
  데이타윈도우의 데이타를 엑셀로 내려받을때 컬럼명이 영문으로 나오는 것을 볼
수 있습니다.
 
  화면에서의 컬럼명처럼 엑셀파일에서도 한글컬럼명이 보여지기를 원할 때 다음과
같이 작성하시면 원하는 결과를 얻을 수 있습니다.
 
a_code : dw 의 컬럼명
dbname : dw 컬럼 property
a코드 : 바꾸고자 하는 한글컬럼명
dw_sheet.modify("a_code.dbname = '거래선코드'")  // 엑셀 title이 거래선코드
dw_sheet.modify("a_name.dbname = '거래선명'")
dw_sheet.modify("pers_name.dbname = '대표자명'")
dw_sheet.modify("phon_numb.dbname = '전화번호'")
dw_sheet.SaveAs("c:\mis\test.xls",excel!,true)
Posted by SB패밀리