Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Assembler
Перезагрузить страницу Начинаю борьбу за "кодеризацию" населения
Ответ
 
Опции темы Опции просмотра
  (#31 (permalink)) Старый
Timprog Timprog вне форума
Member
 
Сообщений: 23
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 26.07.2003
По умолчанию 07.08.2003, 12:12

А вы уверены, что
mov ax...
int....
и другая 16-ти битная требуха эффективна на том же проклятом всеми асмовцами PIV? И как насчёт сложности программ, и такой фтичи как конвейер и RISC-ядро?
- Почему DOSовская прога под P120 идёт быстрее чем на PIV1700? - что-то явно не так... - потому, что 16 бит и всякие там rep mowsb.
Кстати, асмовцы, что эффективнее:
Код:
 
for (i=0;i<16;i++){
a[i]=b[i];
}
или
Код:
for (i=0;i<16;i+=4){
a[i]=b[i];
a[i+1]=b[i+1];
a[i+2]=b[i+2];
a[i+3]=b[i+3];
}
если это написать на asm. Новые оптимизирующие компилеры иногда похлеще в плане скорости чем asm-ручные заморочки.
Ответить с цитированием
  (#32 (permalink)) Старый
Anonymous
Guest
 
Сообщений: n/a
По умолчанию 07.08.2003, 15:09

Цитата:
Originally posted by Timprog
[b]А вы уверены, что
mov ax...
int....
и другая 16-ти битная требуха эффективна на том же проклятом всеми асмовцами PIV?
За всех, кто использует ассемблер в своей работе, я говорить не могу. Но за себя могу сказать, что защищенный режим мне очень симпатичен (никогда его не проклинал, а, наоборот, приветствовал. Создавать "16-ти битную требуху" под 32-разрядный режим процессора считаю неразумным. На ассемблере можно вполне успешно создавать 32-разрядные приложения.

Цитата:
Originally posted by Timprog+-->
Цитата:
И как насчёт сложности программ, и такой фтичи как конвейер и RISC-ядро?
Сложность программ, как правило, не определяется языком программирования.

Цитата:
Originally posted by Timprog@
[b]- Почему DOSовская прога под P120 идёт быстрее чем на PIV1700? - что-то явно не так... - потому, что 16 бит и всякие там rep mowsb
Хм... Вы видимо говорите о инструкции movs(b/w/d). Но проблема не в ней или в 16-разрядах. Замедление происходит потому, что вызов системных функций в данном случае происходит через виртульную машину, которая и ответственна за снижение быстродействия работы программы. Если же поднять любой справочник, где есть время выполнения команд, то можно обнаружить, что время выполнения редко зависит от разрядности операндов.

<!--QuoteBegin-Timprog

[b]Кстати, асмовцы, что эффективнее:
Код:
 
for (i=0;i<16;i++){
a[i]=b[i];
}
или
Код:
for (i=0;i<16;i+=4){
a[i]=b[i];
a[i+1]=b[i+1];
a[i+2]=b[i+2];
a[i+3]=b[i+3];
}
если это написать на asm. Новые оптимизирующие компилеры иногда похлеще в плане скорости чем asm-ручные заморочки.
Эффективность сильно зависит от того, под какой процессор пишется программа. Первый вариант, как правило, эффективнее. Но если учитывать, что EPIC процессоры могут параллельно выполнять несколько операндов, то для них, возможно, второй вариант будет предпочтительнее (особенно, если в правой части будут какие-то вычисления).
Относительно эффективности оптимизирующих компиляторов, отмечу, что надо хорошо понимать, что с чем сравнивается. Оптимизацией компиляторов занимаются высококвалифицированные специалисты. Если программист, пишущий на ассемблере, имеет квалификацию не ниже тех специалистов, то его программа будет эффективнее, чем после компиляции с ЯВУ.
Ответить с цитированием
  (#33 (permalink)) Старый
Anonymous
Guest
 
Сообщений: n/a
По умолчанию 22.08.2003, 21:49

Цитата:
Кстати, асмовцы, что эффективнее:
Код:
 
for (i=0;i<16;i++){
a[i]=b[i];
}
или
Код:
for (i=0;i<16;i+=4){
a[i]=b[i];
a[i+1]=b[i+1];
a[i+2]=b[i+2];
a[i+3]=b[i+3];
}
А размер элемента массива какой?

Цитата:
если это написать на asm. Новые оптимизирующие компилеры иногда похлеще в плане скорости чем asm-ручные заморочки.
Говорим точнее.

1. С++ 7.0 показывает замечательные результаты.
Это правда, действительно радует. (Особенно, кто на оптимизации под Асм съел собаку и без соли )

Но всё-таки заметте, что оптимизатор требует от вас, чтобы вы писали ЯВНЫЙ КОД.

Что это такое? Это когда оптимизатор может понять что лучше.

Очень часто я на это напарываюсь, пытаясь оптимизировать код ЯВУ.
Делаю вроде лучше, а входит наоборот.

Снова приходится в АСМ лезть

Ну а как бы ЯВУ не были хороши. Всё равно, пока никто не переплюнет изворотливого ума. Да и алгоритмы писать намного легче.

P.S

На следующей недели будет система макро для генерации WndProc
Обещаю, что такого вы и Delphi не видели

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
С уважением, Edmond / HI-TECH
verum index sui et falsi
http://wasm.ru
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Ответить с цитированием
  (#34 (permalink)) Старый
Vivalzard Vivalzard вне форума
Member
 
Сообщений: 34
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 19.11.2003
По умолчанию 01.12.2003, 22:01

Ну вы народ нагородили ! Зачем-то программистов на касты поделили, причем кому нужен АСМ, кому нет? Зачем? Вот мое мнение: без понимания внутренней структуры работы ЭВМ далеко шагнуть в мир программирования невозможно, ибо любой компилятор не прооптимизирует ваш код, так как если бы вы сделали это сами. А без знания языка низкого уровня (АСМ или маш. коды, хотя это одно и тоже) этого сделать просто неудастся !

И вообще я ЗА знание АССЕМБЛЕРА !

И вот сайтик посмотрел - ХВАЛЮ ! Довольно мило! Прям как дома!
Ответить с цитированием
  (#35 (permalink)) Старый
Anonymous
Guest
 
Сообщений: n/a
По умолчанию 17.12.2003, 04:52

Все эт замечательно..
Но я б очень хотел посмотреть на человека, к-й напишет прогу для работы с БД на Ассемблере.
ODBC и все такое..
Медаль сразу.
Ответить с цитированием
Ads.
  (#36 (permalink)) Старый
Anonymous
Guest
 
Сообщений: n/a
По умолчанию 19.12.2003, 00:17

Цитата:
Originally posted by Anonymous
[b]Все эт замечательно..
Но я б очень хотел посмотреть на человека, к-й напишет прогу для работы с БД на Ассемблере.
ODBC и все такое..
Медаль сразу.
Написать программу на ассемблере, работающую с СУБД, не просто, а... очень просто. В свое время у меня было написано много утилит для работы с Firebird (Interbase) на native API. Кстати, рекомендую посмотреть на API Firebird, это хороший пример того, каким должен быть API. И что, мне можно занимать очередь за медалью?
Ответить с цитированием
Ads
  (#37 (permalink)) Старый
Anonymous
Guest
 
Сообщений: n/a
По умолчанию 20.12.2003, 03:03

Ага.. А если поподробнее?
Примерчик и все такое?
Желательно Oracle, Cache ну и убогий Access..
Медаль уже в коробочке - ждет победителя..
Ответить с цитированием
  (#38 (permalink)) Старый
Anonymous
Guest
 
Сообщений: n/a
По умолчанию 20.12.2003, 03:03

Ага.. А если поподробнее?
Примерчик и все такое?
Желательно Oracle, Cache ну и убогий Access..
Медаль уже в коробочке - ждет победителя..
Ответить с цитированием
  (#39 (permalink)) Старый
Anonymous
Guest
 
Сообщений: n/a
По умолчанию 20.12.2003, 03:03

Ага.. А если поподробнее?
Примерчик и все такое?
Желательно Oracle, Cache ну и убогий Access..
Медаль уже в коробочке - ждет победителя..
Ответить с цитированием
  (#40 (permalink)) Старый
Anonymous
Guest
 
Сообщений: n/a
По умолчанию 20.12.2003, 03:03

Ага.. А если поподробнее?
Примерчик и все такое?
Желательно Oracle, Cache ну и убогий Access..
Медаль уже в коробочке - ждет победителя..
Ответить с цитированием
  (#41 (permalink)) Старый
Anonymous
Guest
 
Сообщений: n/a
По умолчанию 20.12.2003, 03:03

Ага.. А если поподробнее?
Примерчик и все такое?
Желательно Oracle, Cache ну и убогий Access..
Медаль уже в коробочке - ждет победителя..
Ответить с цитированием
  (#42 (permalink)) Старый
Anonymous
Guest
 
Сообщений: n/a
По умолчанию 23.12.2003, 02:47

Цитата:
Originally posted by Anonymous
[b]Ага.. А если поподробнее?
Примерчик и все такое?
Желательно Oracle, Cache ну и убогий Access..
Медаль уже в коробочке - ждет победителя..
Пример?! Пожалуйста. Это простая демонстрационная программка под Win32, которая позволяет создавать базу данных или соединиться с существующей базой данных, а также выполнить любой SQL-оператор (CREATE ..., ALTER ..., DROP ..., INSERT INTO ..., DELETE FROM ...). Единственное ограничение на исполнение операторов состоит в том, что не отображаются результаты выборки (оператор SELECT). Сделано это сознательно, поскольку в этом случае необходимо добавить работу с памятью, преобразование данных из различных форматов (целые, вещественные, даты и время, строки, BLObs и пр.). Наглядности это не добавит, но затруднит понимание исходного текста программы. В действительности, особых сложностей с реализацией оператора выборки нет (поверьте на слово или проверьте сами). Размер EXE-файла 8 Кб. Компилируется TASM, для линковки используется TLink. Диалоги сделаны в Visual Studio (rc & res файлы).
Код:
; =================================
;    Interbase API 02
;    written by Alexander Usoff
;    Jan. 1998 y.
;    for FIDO.ASM&WIN32
; =================================

; ---------------------------------
;    DB create & connect & job
; ---------------------------------
Ideal
P586
Radix    16
Model    flat

%NOINCL
include    "winconst.inc"
include    "winprocs.inc"
include    "winmacro.inc"
include    "intrbase.inc"
include    "resource.inc"

quota  =    27
MAX_SERVER    =    20
MAX_DATABASE    =    100
MAX_USER    =    20
MAX_PASSWORD    =    10
MAX_CHARSET    =    0Bh
SV_LENGTH    =    14; status vector length = 20 d

UDataSeg
hInst  dd    ?
dialect  dd    ?
server  db    MAX_SERVER + 1  dup    (?)
ALIGN 4
database    db    MAX_DATABASE + 1    dup    (?)
ALIGN 4
user  db    MAX_USER + 1  dup    (?)
ALIGN 4
password    db    MAX_PASSWORD + 1    dup    (?)
ALIGN 4
charset  db    MAX_CHARSET + 1  dup    (?)
ALIGN 4

DataSeg
hDatabase    dd    0
hTransaction    dd    0
status_vector    dd    SV_LENGTH dup (0)

CodeSeg
; Основная программа (8 строк) :)
Start:  call    GetModuleHandleA,    0
  mov    [hInst],eax

  call    DialogBoxParamA,    eax, IDD_IBLOGON,    
      0, offset IBLogonProc, 0
  or    eax,eax
  jz    short quit

  call    DialogBoxParamA,    [hInst], IDD_SESSION,    
      0, offset SessionProc, 0

  call    isc_detach_database,    offset status_vector,    
      offset hDatabase
quit:  call    ExitProcess,  0

public    stdcall  IBLogonProc
proc    IBLogonProc    stdcall
arg    @@hDlg    :dword,    @@msg    :dword,    @@wPar    :dword,    @@lPar    :dword
local    @@buf    :byte:170
uses    esi, edi

UDataSeg
@@server    dd    ?
@@database    dd    ?
@@protocol    dd    ?
@@user  dd    ?
@@password    dd    ?
@@dialect    dd    ?
@@charset    dd    ?

DataSeg
ALIGN    4
@@charset_str    db    'ASCII', 0
  db    'BIG_5', 0
  db    'CYRL', 0
  db    'DOS437', 0
  db    'DOS850', 0
  db    'DOS852', 0
  db    'DOS857', 0
  db    'DOS860', 0
  db    'DOS861', 0
  db    'DOS863', 0
  db    'DOS865', 0
  db    'EUCJ_0208', 0
  db    'GB_2312', 0
  db    'ISO8859_1', 0
  db    'KSC_5601', 0
  db    'NEXT', 0
  db    'NONE', 0
  db    'OCTETS', 0
  db    'SJIS_0208', 0
  db    'UNICODE_FSS', 0
  db    'WIN1250', 0
  db    'WIN1251', 0
  db    'WIN1252', 0
  db    'WIN1253', 0
  db    'WIN1254', 0, 0

@@dialect_str    db    '1', 0, '2', 0, '3', 0, 0
@@protocol_str    db    'TCP/IP', 0, 'NetBEUI', 0, 0

@@sql_createdb    db    @@len_createdb
  db    'CREATE DATABASE ', quota
@@len_createdb    =    $ - @@sql_createdb - 1

@@sql_dbuser    db    @@len_dbuser
  db    quota, ' USER ', quota
@@len_dbuser    =    $ - @@sql_dbuser - 1

@@sql_dbpswd    db    @@len_dbpswd
  db    quota, ' PASSWORD ', quota
@@len_dbpswd    =    $ - @@sql_dbpswd - 1

@@sql_dbpage    db    @@len_dbpage
  db    quota, ' PAGE_SIZE = 4096 DEFAULT CHARACTER SET '
@@len_dbpage    =    $ - @@sql_dbpage - 1

DlgVector    WM_INITDIALOG, WM_COMMAND

MSG_HANDLER    WM_INITDIALOG
  mov    edi,IDC_SERVER - 1
  mov    esi,offset @@server - 4

@@init_item:    inc    edi
  add    esi,4
  call    GetDlgItem,    [@@hDlg], edi
  mov    [dword esi],eax
  cmp    edi,IDC_CHARSET
  jb    short @@init_item

  call    SendMessageA,  [@@server], EM_LIMITTEXT, MAX_SERVER - 1, 0
  call    SendMessageA,  [@@database], EM_LIMITTEXT, MAX_DATABASE - 1, 0
  call    SendMessageA,  [@@user], EM_LIMITTEXT, MAX_USER - 1, 0
  call    SendMessageA,  [@@password], EM_LIMITTEXT, MAX_PASSWORD - 1, 0

  mov    edi,[@@charset]
  mov    esi,offset @@charset_str
  call    FillCombobox    stdcall,    10

  mov    edi,[@@dialect]
  call    FillCombobox    stdcall,    2

  mov    edi,[@@protocol]
  call    FillCombobox    stdcall,    1

END_HANDLER    ret_true

MSG_HANDLER    WM_COMMAND
CmdVector    IDC_DBCREATE, IDC_DBCONNECT, IDC_LOGCANCEL
END_HANDLER

MSG_HANDLER    IDC_DBCREATE
; read fields
; create database
; detach database
  mov    edi,offset @@create_database

@@read_logparams:
  call    SendMessageA,  [@@server], WM_GETTEXT, MAX_SERVER, offset server + 1
  mov    [server],al
  call    SendMessageA,  [@@database], WM_GETTEXT, MAX_DATABASE, offset database + 1
  mov    [database],al
  call    SendMessageA,  [@@user], WM_GETTEXT, MAX_USER, offset user + 1
  mov    [user],al
  call    SendMessageA,  [@@password], WM_GETTEXT, MAX_PASSWORD, offset password + 1
  mov    [password],al
  call    SendMessageA,  [@@charset], WM_GETTEXT, MAX_CHARSET, offset charset + 1
  mov    [charset],al
  call    SendMessageA,  [@@dialect], CB_GETCURSEL, 0, 0
  inc    eax
  mov    [dialect],eax
  jmp    edi

@@create_database:
  lea    edi,[@@buf]
  mov    edx,edi
  xor    ecx,ecx
  cld

  CopyPStr    offset @@sql_createdb

  mov    cl,[server]
  or    ecx,ecx
  jz    short @@copy_db

  call    SendMessageA,  [@@protocol], CB_GETCURSEL, 0, 0
  xor    ecx,ecx
  or    eax,eax
  mov    al,':'
  jnz    short @@tcpip

  mov    [word edi],''
  add    edi,2
  mov    al,''

@@tcpip:    CopyPStr    offset server
  stosb

@@copy_db:    ConcatPStr    database, @@sql_dbuser, user, @@sql_dbpswd, password, @@sql_dbpage, charset

  mov    al,';'
  stosb
  sub    edi,edx

  call    isc_dsql_exec_immed2,    offset status_vector,    
      offset hDatabase,    
      offset hTransaction,    
      edi, edx, [dialect],    
      0, 0
  or    eax,eax
  jnz    @@err_createdb
  call    isc_detach_database,    offset status_vector,    
      offset hDatabase
END_HANDLER    connect

MSG_HANDLER    IDC_DBCONNECT
; read fields
; fill dpb
; connect database
  mov    edi,offset @@connect
  jmp    @@read_logparams

@@connect:    lea    edi,[@@buf]
  mov    edx,edi
  mov    [dword edi],(((((0F0 shl 8) + 1) shl 8) + isc_dpb_num_buffers) shl 8) + isc_dpb_version1
  add    edi,4
  mov    [word edi],isc_dpb_force_write
  add    edi,2
  xor    ecx,ecx
  cld
  mov    [byte edi],isc_dpb_lc_ctype
  mov    esi,offset charset
  inc    edi
  mov    cl,[byte esi]
  inc    ecx
  rep    movsb

  mov    [byte edi],isc_dpb_user_name
  mov    esi,offset user
  inc    edi
  mov    cl,[byte esi]
  inc    ecx
  rep    movsb

  mov    [byte edi],isc_dpb_password
  mov    esi,offset password
  inc    edi
  mov    cl,[byte esi]
  inc    ecx
  rep    movsb

  sub    edi,edx
  call    isc_attach_database,    offset status_vector,  
      ecx, offset database + 1,    
      offset hDatabase, edi, edx
  or    eax,eax
  jnz    short @@err_attach

  mov    eax,1
END_HANDLER    short    end

MSG_HANDLER    IDC_LOGCANCEL
  xor    eax,eax
@@end:  call    EndDialog,    [@@hDlg], eax
END_HANDLER    ret_false

@@err_createdb:
@@err_attach:
  jmp    @@ret_false

endp    IBLogonProc

proc    FillCombobox    stdcall
arg    @@index    :dword
; edi = id combobox item
; esi = offset string list

@@1:  call    SendMessageA,    edi, CB_ADDSTRING, 0, esi
  xor    eax,eax
@@2:  mov    al,[byte esi]
  inc    esi
  or    eax,eax
  jnz    short @@2
  mov    al,[byte esi]
  or    eax,eax
  jnz    short @@1
  call    SendMessageA,    edi, CB_SETCURSEL, [@@index], 0
  inc    esi
  ret
endp    FillCombobox

public    stdcall  SessionProc
proc    SessionProc    stdcall
arg    @@hDlg    :dword,    @@msg    :dword,    @@wPar    :dword,    @@lPar    :dword
local    @@psv    :dword,    @@len    :dword,    @@buf    :byte:400

UDataSeg
@@query  dd    ?
@@history    dd    ?

DataSeg
ALIGN    4
tpb  db    isc_tpb_version3
  db    isc_tpb_write
  db    isc_tpb_read_committed
  db    isc_tpb_no_rec_version
  db    isc_tpb_wait
LENGTH_TPB    =    $ - tpb
@@ok  db    'Ok.'
@@zero  db    0
@@error  db    'Error!', 0

DlgVector    WM_INITDIALOG, WM_COMMAND

MSG_HANDLER    WM_INITDIALOG
  call    GetDlgItem,      [@@hDlg], IDC_QUERY
  mov    [@@query],eax
  call    GetDlgItem,      [@@hDlg], IDC_HISTORY
  mov    [@@history],eax

  call    isc_start_transaction,  offset status_vector,    
          offset hTransaction,    
          1, offset hDataBase,    
          LENGTH_TPB, offset tpb
END_HANDLER    short    ret_false

MSG_HANDLER    WM_COMMAND
CmdVector    IDC_RUN, IDC_COMMIT, IDC_ROLLBACK, IDC_OK
END_HANDLER    short    ret_false

MSG_HANDLER    IDC_RUN
  push    ebx
  lea    ebx,[@@buf]
  call    SendMessageA,      [@@query], WM_GETTEXT, 400, ebx
  or    eax,eax
  jz    @@ret_false

  dec    eax
  mov    [@@len],eax
  xor    eax,eax
  mov    edx,ebx

@@scan:  mov    al,[byte edx]
  inc    edx
  cmp    al,0Dh
  je    short @@eol
  or    eax,eax
  jz    short @@exec
  jmp    short @@scan

@@eol:  mov    [byte edx - 1],0
  push    edx
  call    SendMessageA,      [@@history], LB_ADDSTRING, 0, ebx
  pop    edx
  mov    [byte edx - 1],0Dh
  inc    edx
  mov    ebx,edx
  jmp    short @@scan

@@exec:  call    SendMessageA,      [@@history], LB_ADDSTRING, 0, ebx
  lea    ebx,[@@buf]
  call    isc_dsql_exec_immed2,  offset status_vector,    
          offset hDataBase,    
          offset hTransaction,    
          [@@len], ebx, [dialect], 0, 0
  or    eax,eax
  jnz    short @@err_query

  call    SendMessageA,      [@@query], WM_SETTEXT, 0, offset @@zero
  call    SendMessageA,      [@@history], LB_ADDSTRING, 0, offset @@ok
  call    SendMessageA,      [@@history], LB_ADDSTRING, 0, offset @@zero
  pop    ebx
END_HANDLER    ret_false

@@err_query:    call    SendMessageA,      [@@history], LB_ADDSTRING, 0, offset @@error
  mov    [@@psv],offset status_vector

@@err_loop:    lea    edx,[@@psv]
  call    isc_interprete,      ebx, edx
  or    eax,eax
  jz    short @@end_err_loop
  call    SendMessageA,      [@@history], LB_ADDSTRING, 0, ebx
  jmp    short @@err_loop
@@end_err_loop:    call    SendMessageA,      [@@history], LB_ADDSTRING, 0, offset @@zero
  pop    ebx
  jmp    @@ret_false

MSG_HANDLER    IDC_COMMIT
  call    isc_commit_retaining,  offset status_vector,    
          offset hTransaction
END_HANDLER    ret_false

MSG_HANDLER    IDC_ROLLBACK
  call    isc_rollback_retaining,  offset status_vector,    
          offset hTransaction
END_HANDLER    ret_false

MSG_HANDLER    IDC_OK
  call    isc_commit_transaction,  offset status_vector,    
          offset hTransaction
  call    EndDialog,      [@@hDlg], 0
END_HANDLER    ret_false

endp    SessionProc

End    Start
Работа с Oracle значительно сложнее, Access я не использую. А Cache... это для мазохистов (IMHO).
Ответить с цитированием
  (#43 (permalink)) Старый
Anonymous
Guest
 
Сообщений: n/a
По умолчанию 23.12.2003, 02:47

Цитата:
Originally posted by Anonymous
[b]Ага.. А если поподробнее?
Примерчик и все такое?
Желательно Oracle, Cache ну и убогий Access..
Медаль уже в коробочке - ждет победителя..
Пример?! Пожалуйста. Это простая демонстрационная программка под Win32, которая позволяет создавать базу данных или соединиться с существующей базой данных, а также выполнить любой SQL-оператор (CREATE ..., ALTER ..., DROP ..., INSERT INTO ..., DELETE FROM ...). Единственное ограничение на исполнение операторов состоит в том, что не отображаются результаты выборки (оператор SELECT). Сделано это сознательно, поскольку в этом случае необходимо добавить работу с памятью, преобразование данных из различных форматов (целые, вещественные, даты и время, строки, BLObs и пр.). Наглядности это не добавит, но затруднит понимание исходного текста программы. В действительности, особых сложностей с реализацией оператора выборки нет (поверьте на слово или проверьте сами). Размер EXE-файла 8 Кб. Компилируется TASM, для линковки используется TLink. Диалоги сделаны в Visual Studio (rc & res файлы).
Код:
; =================================
;    Interbase API 02
;    written by Alexander Usoff
;    Jan. 1998 y.
;    for FIDO.ASM&WIN32
; =================================

; ---------------------------------
;    DB create & connect & job
; ---------------------------------
Ideal
P586
Radix    16
Model    flat

%NOINCL
include    "winconst.inc"
include    "winprocs.inc"
include    "winmacro.inc"
include    "intrbase.inc"
include    "resource.inc"

quota  =    27
MAX_SERVER    =    20
MAX_DATABASE    =    100
MAX_USER    =    20
MAX_PASSWORD    =    10
MAX_CHARSET    =    0Bh
SV_LENGTH    =    14; status vector length = 20 d

UDataSeg
hInst  dd    ?
dialect  dd    ?
server  db    MAX_SERVER + 1  dup    (?)
ALIGN 4
database    db    MAX_DATABASE + 1    dup    (?)
ALIGN 4
user  db    MAX_USER + 1  dup    (?)
ALIGN 4
password    db    MAX_PASSWORD + 1    dup    (?)
ALIGN 4
charset  db    MAX_CHARSET + 1  dup    (?)
ALIGN 4

DataSeg
hDatabase    dd    0
hTransaction    dd    0
status_vector    dd    SV_LENGTH dup (0)

CodeSeg
; Основная программа (8 строк) :)
Start:  call    GetModuleHandleA,    0
  mov    [hInst],eax

  call    DialogBoxParamA,    eax, IDD_IBLOGON,    
      0, offset IBLogonProc, 0
  or    eax,eax
  jz    short quit

  call    DialogBoxParamA,    [hInst], IDD_SESSION,    
      0, offset SessionProc, 0

  call    isc_detach_database,    offset status_vector,    
      offset hDatabase
quit:  call    ExitProcess,  0

public    stdcall  IBLogonProc
proc    IBLogonProc    stdcall
arg    @@hDlg    :dword,    @@msg    :dword,    @@wPar    :dword,    @@lPar    :dword
local    @@buf    :byte:170
uses    esi, edi

UDataSeg
@@server    dd    ?
@@database    dd    ?
@@protocol    dd    ?
@@user  dd    ?
@@password    dd    ?
@@dialect    dd    ?
@@charset    dd    ?

DataSeg
ALIGN    4
@@charset_str    db    'ASCII', 0
  db    'BIG_5', 0
  db    'CYRL', 0
  db    'DOS437', 0
  db    'DOS850', 0
  db    'DOS852', 0
  db    'DOS857', 0
  db    'DOS860', 0
  db    'DOS861', 0
  db    'DOS863', 0
  db    'DOS865', 0
  db    'EUCJ_0208', 0
  db    'GB_2312', 0
  db    'ISO8859_1', 0
  db    'KSC_5601', 0
  db    'NEXT', 0
  db    'NONE', 0
  db    'OCTETS', 0
  db    'SJIS_0208', 0
  db    'UNICODE_FSS', 0
  db    'WIN1250', 0
  db    'WIN1251', 0
  db    'WIN1252', 0
  db    'WIN1253', 0
  db    'WIN1254', 0, 0

@@dialect_str    db    '1', 0, '2', 0, '3', 0, 0
@@protocol_str    db    'TCP/IP', 0, 'NetBEUI', 0, 0

@@sql_createdb    db    @@len_createdb
  db    'CREATE DATABASE ', quota
@@len_createdb    =    $ - @@sql_createdb - 1

@@sql_dbuser    db    @@len_dbuser
  db    quota, ' USER ', quota
@@len_dbuser    =    $ - @@sql_dbuser - 1

@@sql_dbpswd    db    @@len_dbpswd
  db    quota, ' PASSWORD ', quota
@@len_dbpswd    =    $ - @@sql_dbpswd - 1

@@sql_dbpage    db    @@len_dbpage
  db    quota, ' PAGE_SIZE = 4096 DEFAULT CHARACTER SET '
@@len_dbpage    =    $ - @@sql_dbpage - 1

DlgVector    WM_INITDIALOG, WM_COMMAND

MSG_HANDLER    WM_INITDIALOG
  mov    edi,IDC_SERVER - 1
  mov    esi,offset @@server - 4

@@init_item:    inc    edi
  add    esi,4
  call    GetDlgItem,    [@@hDlg], edi
  mov    [dword esi],eax
  cmp    edi,IDC_CHARSET
  jb    short @@init_item

  call    SendMessageA,  [@@server], EM_LIMITTEXT, MAX_SERVER - 1, 0
  call    SendMessageA,  [@@database], EM_LIMITTEXT, MAX_DATABASE - 1, 0
  call    SendMessageA,  [@@user], EM_LIMITTEXT, MAX_USER - 1, 0
  call    SendMessageA,  [@@password], EM_LIMITTEXT, MAX_PASSWORD - 1, 0

  mov    edi,[@@charset]
  mov    esi,offset @@charset_str
  call    FillCombobox    stdcall,    10

  mov    edi,[@@dialect]
  call    FillCombobox    stdcall,    2

  mov    edi,[@@protocol]
  call    FillCombobox    stdcall,    1

END_HANDLER    ret_true

MSG_HANDLER    WM_COMMAND
CmdVector    IDC_DBCREATE, IDC_DBCONNECT, IDC_LOGCANCEL
END_HANDLER

MSG_HANDLER    IDC_DBCREATE
; read fields
; create database
; detach database
  mov    edi,offset @@create_database

@@read_logparams:
  call    SendMessageA,  [@@server], WM_GETTEXT, MAX_SERVER, offset server + 1
  mov    [server],al
  call    SendMessageA,  [@@database], WM_GETTEXT, MAX_DATABASE, offset database + 1
  mov    [database],al
  call    SendMessageA,  [@@user], WM_GETTEXT, MAX_USER, offset user + 1
  mov    [user],al
  call    SendMessageA,  [@@password], WM_GETTEXT, MAX_PASSWORD, offset password + 1
  mov    [password],al
  call    SendMessageA,  [@@charset], WM_GETTEXT, MAX_CHARSET, offset charset + 1
  mov    [charset],al
  call    SendMessageA,  [@@dialect], CB_GETCURSEL, 0, 0
  inc    eax
  mov    [dialect],eax
  jmp    edi

@@create_database:
  lea    edi,[@@buf]
  mov    edx,edi
  xor    ecx,ecx
  cld

  CopyPStr    offset @@sql_createdb

  mov    cl,[server]
  or    ecx,ecx
  jz    short @@copy_db

  call    SendMessageA,  [@@protocol], CB_GETCURSEL, 0, 0
  xor    ecx,ecx
  or    eax,eax
  mov    al,':'
  jnz    short @@tcpip

  mov    [word edi],''
  add    edi,2
  mov    al,''

@@tcpip:    CopyPStr    offset server
  stosb

@@copy_db:    ConcatPStr    database, @@sql_dbuser, user, @@sql_dbpswd, password, @@sql_dbpage, charset

  mov    al,';'
  stosb
  sub    edi,edx

  call    isc_dsql_exec_immed2,    offset status_vector,    
      offset hDatabase,    
      offset hTransaction,    
      edi, edx, [dialect],    
      0, 0
  or    eax,eax
  jnz    @@err_createdb
  call    isc_detach_database,    offset status_vector,    
      offset hDatabase
END_HANDLER    connect

MSG_HANDLER    IDC_DBCONNECT
; read fields
; fill dpb
; connect database
  mov    edi,offset @@connect
  jmp    @@read_logparams

@@connect:    lea    edi,[@@buf]
  mov    edx,edi
  mov    [dword edi],(((((0F0 shl 8) + 1) shl 8) + isc_dpb_num_buffers) shl 8) + isc_dpb_version1
  add    edi,4
  mov    [word edi],isc_dpb_force_write
  add    edi,2
  xor    ecx,ecx
  cld
  mov    [byte edi],isc_dpb_lc_ctype
  mov    esi,offset charset
  inc    edi
  mov    cl,[byte esi]
  inc    ecx
  rep    movsb

  mov    [byte edi],isc_dpb_user_name
  mov    esi,offset user
  inc    edi
  mov    cl,[byte esi]
  inc    ecx
  rep    movsb

  mov    [byte edi],isc_dpb_password
  mov    esi,offset password
  inc    edi
  mov    cl,[byte esi]
  inc    ecx
  rep    movsb

  sub    edi,edx
  call    isc_attach_database,    offset status_vector,  
      ecx, offset database + 1,    
      offset hDatabase, edi, edx
  or    eax,eax
  jnz    short @@err_attach

  mov    eax,1
END_HANDLER    short    end

MSG_HANDLER    IDC_LOGCANCEL
  xor    eax,eax
@@end:  call    EndDialog,    [@@hDlg], eax
END_HANDLER    ret_false

@@err_createdb:
@@err_attach:
  jmp    @@ret_false

endp    IBLogonProc

proc    FillCombobox    stdcall
arg    @@index    :dword
; edi = id combobox item
; esi = offset string list

@@1:  call    SendMessageA,    edi, CB_ADDSTRING, 0, esi
  xor    eax,eax
@@2:  mov    al,[byte esi]
  inc    esi
  or    eax,eax
  jnz    short @@2
  mov    al,[byte esi]
  or    eax,eax
  jnz    short @@1
  call    SendMessageA,    edi, CB_SETCURSEL, [@@index], 0
  inc    esi
  ret
endp    FillCombobox

public    stdcall  SessionProc
proc    SessionProc    stdcall
arg    @@hDlg    :dword,    @@msg    :dword,    @@wPar    :dword,    @@lPar    :dword
local    @@psv    :dword,    @@len    :dword,    @@buf    :byte:400

UDataSeg
@@query  dd    ?
@@history    dd    ?

DataSeg
ALIGN    4
tpb  db    isc_tpb_version3
  db    isc_tpb_write
  db    isc_tpb_read_committed
  db    isc_tpb_no_rec_version
  db    isc_tpb_wait
LENGTH_TPB    =    $ - tpb
@@ok  db    'Ok.'
@@zero  db    0
@@error  db    'Error!', 0

DlgVector    WM_INITDIALOG, WM_COMMAND

MSG_HANDLER    WM_INITDIALOG
  call    GetDlgItem,      [@@hDlg], IDC_QUERY
  mov    [@@query],eax
  call    GetDlgItem,      [@@hDlg], IDC_HISTORY
  mov    [@@history],eax

  call    isc_start_transaction,  offset status_vector,    
          offset hTransaction,    
          1, offset hDataBase,    
          LENGTH_TPB, offset tpb
END_HANDLER    short    ret_false

MSG_HANDLER    WM_COMMAND
CmdVector    IDC_RUN, IDC_COMMIT, IDC_ROLLBACK, IDC_OK
END_HANDLER    short    ret_false

MSG_HANDLER    IDC_RUN
  push    ebx
  lea    ebx,[@@buf]
  call    SendMessageA,      [@@query], WM_GETTEXT, 400, ebx
  or    eax,eax
  jz    @@ret_false

  dec    eax
  mov    [@@len],eax
  xor    eax,eax
  mov    edx,ebx

@@scan:  mov    al,[byte edx]
  inc    edx
  cmp    al,0Dh
  je    short @@eol
  or    eax,eax
  jz    short @@exec
  jmp    short @@scan

@@eol:  mov    [byte edx - 1],0
  push    edx
  call    SendMessageA,      [@@history], LB_ADDSTRING, 0, ebx
  pop    edx
  mov    [byte edx - 1],0Dh
  inc    edx
  mov    ebx,edx
  jmp    short @@scan

@@exec:  call    SendMessageA,      [@@history], LB_ADDSTRING, 0, ebx
  lea    ebx,[@@buf]
  call    isc_dsql_exec_immed2,  offset status_vector,    
          offset hDataBase,    
          offset hTransaction,    
          [@@len], ebx, [dialect], 0, 0
  or    eax,eax
  jnz    short @@err_query

  call    SendMessageA,      [@@query], WM_SETTEXT, 0, offset @@zero
  call    SendMessageA,      [@@history], LB_ADDSTRING, 0, offset @@ok
  call    SendMessageA,      [@@history], LB_ADDSTRING, 0, offset @@zero
  pop    ebx
END_HANDLER    ret_false

@@err_query:    call    SendMessageA,      [@@history], LB_ADDSTRING, 0, offset @@error
  mov    [@@psv],offset status_vector

@@err_loop:    lea    edx,[@@psv]
  call    isc_interprete,      ebx, edx
  or    eax,eax
  jz    short @@end_err_loop
  call    SendMessageA,      [@@history], LB_ADDSTRING, 0, ebx
  jmp    short @@err_loop
@@end_err_loop:    call    SendMessageA,      [@@history], LB_ADDSTRING, 0, offset @@zero
  pop    ebx
  jmp    @@ret_false

MSG_HANDLER    IDC_COMMIT
  call    isc_commit_retaining,  offset status_vector,    
          offset hTransaction
END_HANDLER    ret_false

MSG_HANDLER    IDC_ROLLBACK
  call    isc_rollback_retaining,  offset status_vector,    
          offset hTransaction
END_HANDLER    ret_false

MSG_HANDLER    IDC_OK
  call    isc_commit_transaction,  offset status_vector,    
          offset hTransaction
  call    EndDialog,      [@@hDlg], 0
END_HANDLER    ret_false

endp    SessionProc

End    Start
Работа с Oracle значительно сложнее, Access я не использую. А Cache... это для мазохистов (IMHO).
Ответить с цитированием
  (#44 (permalink)) Старый
Anonymous
Guest
 
Сообщений: n/a
По умолчанию 23.12.2003, 02:47

Цитата:
Originally posted by Anonymous
[b]Ага.. А если поподробнее?
Примерчик и все такое?
Желательно Oracle, Cache ну и убогий Access..
Медаль уже в коробочке - ждет победителя..
Пример?! Пожалуйста. Это простая демонстрационная программка под Win32, которая позволяет создавать базу данных или соединиться с существующей базой данных, а также выполнить любой SQL-оператор (CREATE ..., ALTER ..., DROP ..., INSERT INTO ..., DELETE FROM ...). Единственное ограничение на исполнение операторов состоит в том, что не отображаются результаты выборки (оператор SELECT). Сделано это сознательно, поскольку в этом случае необходимо добавить работу с памятью, преобразование данных из различных форматов (целые, вещественные, даты и время, строки, BLObs и пр.). Наглядности это не добавит, но затруднит понимание исходного текста программы. В действительности, особых сложностей с реализацией оператора выборки нет (поверьте на слово или проверьте сами). Размер EXE-файла 8 Кб. Компилируется TASM, для линковки используется TLink. Диалоги сделаны в Visual Studio (rc & res файлы).
Код:
; =================================
;    Interbase API 02
;    written by Alexander Usoff
;    Jan. 1998 y.
;    for FIDO.ASM&WIN32
; =================================

; ---------------------------------
;    DB create & connect & job
; ---------------------------------
Ideal
P586
Radix    16
Model    flat

%NOINCL
include    "winconst.inc"
include    "winprocs.inc"
include    "winmacro.inc"
include    "intrbase.inc"
include    "resource.inc"

quota  =    27
MAX_SERVER    =    20
MAX_DATABASE    =    100
MAX_USER    =    20
MAX_PASSWORD    =    10
MAX_CHARSET    =    0Bh
SV_LENGTH    =    14; status vector length = 20 d

UDataSeg
hInst  dd    ?
dialect  dd    ?
server  db    MAX_SERVER + 1  dup    (?)
ALIGN 4
database    db    MAX_DATABASE + 1    dup    (?)
ALIGN 4
user  db    MAX_USER + 1  dup    (?)
ALIGN 4
password    db    MAX_PASSWORD + 1    dup    (?)
ALIGN 4
charset  db    MAX_CHARSET + 1  dup    (?)
ALIGN 4

DataSeg
hDatabase    dd    0
hTransaction    dd    0
status_vector    dd    SV_LENGTH dup (0)

CodeSeg
; Основная программа (8 строк) :)
Start:  call    GetModuleHandleA,    0
  mov    [hInst],eax

  call    DialogBoxParamA,    eax, IDD_IBLOGON,    
      0, offset IBLogonProc, 0
  or    eax,eax
  jz    short quit

  call    DialogBoxParamA,    [hInst], IDD_SESSION,    
      0, offset SessionProc, 0

  call    isc_detach_database,    offset status_vector,    
      offset hDatabase
quit:  call    ExitProcess,  0

public    stdcall  IBLogonProc
proc    IBLogonProc    stdcall
arg    @@hDlg    :dword,    @@msg    :dword,    @@wPar    :dword,    @@lPar    :dword
local    @@buf    :byte:170
uses    esi, edi

UDataSeg
@@server    dd    ?
@@database    dd    ?
@@protocol    dd    ?
@@user  dd    ?
@@password    dd    ?
@@dialect    dd    ?
@@charset    dd    ?

DataSeg
ALIGN    4
@@charset_str    db    'ASCII', 0
  db    'BIG_5', 0
  db    'CYRL', 0
  db    'DOS437', 0
  db    'DOS850', 0
  db    'DOS852', 0
  db    'DOS857', 0
  db    'DOS860', 0
  db    'DOS861', 0
  db    'DOS863', 0
  db    'DOS865', 0
  db    'EUCJ_0208', 0
  db    'GB_2312', 0
  db    'ISO8859_1', 0
  db    'KSC_5601', 0
  db    'NEXT', 0
  db    'NONE', 0
  db    'OCTETS', 0
  db    'SJIS_0208', 0
  db    'UNICODE_FSS', 0
  db    'WIN1250', 0
  db    'WIN1251', 0
  db    'WIN1252', 0
  db    'WIN1253', 0
  db    'WIN1254', 0, 0

@@dialect_str    db    '1', 0, '2', 0, '3', 0, 0
@@protocol_str    db    'TCP/IP', 0, 'NetBEUI', 0, 0

@@sql_createdb    db    @@len_createdb
  db    'CREATE DATABASE ', quota
@@len_createdb    =    $ - @@sql_createdb - 1

@@sql_dbuser    db    @@len_dbuser
  db    quota, ' USER ', quota
@@len_dbuser    =    $ - @@sql_dbuser - 1

@@sql_dbpswd    db    @@len_dbpswd
  db    quota, ' PASSWORD ', quota
@@len_dbpswd    =    $ - @@sql_dbpswd - 1

@@sql_dbpage    db    @@len_dbpage
  db    quota, ' PAGE_SIZE = 4096 DEFAULT CHARACTER SET '
@@len_dbpage    =    $ - @@sql_dbpage - 1

DlgVector    WM_INITDIALOG, WM_COMMAND

MSG_HANDLER    WM_INITDIALOG
  mov    edi,IDC_SERVER - 1
  mov    esi,offset @@server - 4

@@init_item:    inc    edi
  add    esi,4
  call    GetDlgItem,    [@@hDlg], edi
  mov    [dword esi],eax
  cmp    edi,IDC_CHARSET
  jb    short @@init_item

  call    SendMessageA,  [@@server], EM_LIMITTEXT, MAX_SERVER - 1, 0
  call    SendMessageA,  [@@database], EM_LIMITTEXT, MAX_DATABASE - 1, 0
  call    SendMessageA,  [@@user], EM_LIMITTEXT, MAX_USER - 1, 0
  call    SendMessageA,  [@@password], EM_LIMITTEXT, MAX_PASSWORD - 1, 0

  mov    edi,[@@charset]
  mov    esi,offset @@charset_str
  call    FillCombobox    stdcall,    10

  mov    edi,[@@dialect]
  call    FillCombobox    stdcall,    2

  mov    edi,[@@protocol]
  call    FillCombobox    stdcall,    1

END_HANDLER    ret_true

MSG_HANDLER    WM_COMMAND
CmdVector    IDC_DBCREATE, IDC_DBCONNECT, IDC_LOGCANCEL
END_HANDLER

MSG_HANDLER    IDC_DBCREATE
; read fields
; create database
; detach database
  mov    edi,offset @@create_database

@@read_logparams:
  call    SendMessageA,  [@@server], WM_GETTEXT, MAX_SERVER, offset server + 1
  mov    [server],al
  call    SendMessageA,  [@@database], WM_GETTEXT, MAX_DATABASE, offset database + 1
  mov    [database],al
  call    SendMessageA,  [@@user], WM_GETTEXT, MAX_USER, offset user + 1
  mov    [user],al
  call    SendMessageA,  [@@password], WM_GETTEXT, MAX_PASSWORD, offset password + 1
  mov    [password],al
  call    SendMessageA,  [@@charset], WM_GETTEXT, MAX_CHARSET, offset charset + 1
  mov    [charset],al
  call    SendMessageA,  [@@dialect], CB_GETCURSEL, 0, 0
  inc    eax
  mov    [dialect],eax
  jmp    edi

@@create_database:
  lea    edi,[@@buf]
  mov    edx,edi
  xor    ecx,ecx
  cld

  CopyPStr    offset @@sql_createdb

  mov    cl,[server]
  or    ecx,ecx
  jz    short @@copy_db

  call    SendMessageA,  [@@protocol], CB_GETCURSEL, 0, 0
  xor    ecx,ecx
  or    eax,eax
  mov    al,':'
  jnz    short @@tcpip

  mov    [word edi],''
  add    edi,2
  mov    al,''

@@tcpip:    CopyPStr    offset server
  stosb

@@copy_db:    ConcatPStr    database, @@sql_dbuser, user, @@sql_dbpswd, password, @@sql_dbpage, charset

  mov    al,';'
  stosb
  sub    edi,edx

  call    isc_dsql_exec_immed2,    offset status_vector,    
      offset hDatabase,    
      offset hTransaction,    
      edi, edx, [dialect],    
      0, 0
  or    eax,eax
  jnz    @@err_createdb
  call    isc_detach_database,    offset status_vector,    
      offset hDatabase
END_HANDLER    connect

MSG_HANDLER    IDC_DBCONNECT
; read fields
; fill dpb
; connect database
  mov    edi,offset @@connect
  jmp    @@read_logparams

@@connect:    lea    edi,[@@buf]
  mov    edx,edi
  mov    [dword edi],(((((0F0 shl 8) + 1) shl 8) + isc_dpb_num_buffers) shl 8) + isc_dpb_version1
  add    edi,4
  mov    [word edi],isc_dpb_force_write
  add    edi,2
  xor    ecx,ecx
  cld
  mov    [byte edi],isc_dpb_lc_ctype
  mov    esi,offset charset
  inc    edi
  mov    cl,[byte esi]
  inc    ecx
  rep    movsb

  mov    [byte edi],isc_dpb_user_name
  mov    esi,offset user
  inc    edi
  mov    cl,[byte esi]
  inc    ecx
  rep    movsb

  mov    [byte edi],isc_dpb_password
  mov    esi,offset password
  inc    edi
  mov    cl,[byte esi]
  inc    ecx
  rep    movsb

  sub    edi,edx
  call    isc_attach_database,    offset status_vector,  
      ecx, offset database + 1,    
      offset hDatabase, edi, edx
  or    eax,eax
  jnz    short @@err_attach

  mov    eax,1
END_HANDLER    short    end

MSG_HANDLER    IDC_LOGCANCEL
  xor    eax,eax
@@end:  call    EndDialog,    [@@hDlg], eax
END_HANDLER    ret_false

@@err_createdb:
@@err_attach:
  jmp    @@ret_false

endp    IBLogonProc

proc    FillCombobox    stdcall
arg    @@index    :dword
; edi = id combobox item
; esi = offset string list

@@1:  call    SendMessageA,    edi, CB_ADDSTRING, 0, esi
  xor    eax,eax
@@2:  mov    al,[byte esi]
  inc    esi
  or    eax,eax
  jnz    short @@2
  mov    al,[byte esi]
  or    eax,eax
  jnz    short @@1
  call    SendMessageA,    edi, CB_SETCURSEL, [@@index], 0
  inc    esi
  ret
endp    FillCombobox

public    stdcall  SessionProc
proc    SessionProc    stdcall
arg    @@hDlg    :dword,    @@msg    :dword,    @@wPar    :dword,    @@lPar    :dword
local    @@psv    :dword,    @@len    :dword,    @@buf    :byte:400

UDataSeg
@@query  dd    ?
@@history    dd    ?

DataSeg
ALIGN    4
tpb  db    isc_tpb_version3
  db    isc_tpb_write
  db    isc_tpb_read_committed
  db    isc_tpb_no_rec_version
  db    isc_tpb_wait
LENGTH_TPB    =    $ - tpb
@@ok  db    'Ok.'
@@zero  db    0
@@error  db    'Error!', 0

DlgVector    WM_INITDIALOG, WM_COMMAND

MSG_HANDLER    WM_INITDIALOG
  call    GetDlgItem,      [@@hDlg], IDC_QUERY
  mov    [@@query],eax
  call    GetDlgItem,      [@@hDlg], IDC_HISTORY
  mov    [@@history],eax

  call    isc_start_transaction,  offset status_vector,    
          offset hTransaction,    
          1, offset hDataBase,    
          LENGTH_TPB, offset tpb
END_HANDLER    short    ret_false

MSG_HANDLER    WM_COMMAND
CmdVector    IDC_RUN, IDC_COMMIT, IDC_ROLLBACK, IDC_OK
END_HANDLER    short    ret_false

MSG_HANDLER    IDC_RUN
  push    ebx
  lea    ebx,[@@buf]
  call    SendMessageA,      [@@query], WM_GETTEXT, 400, ebx
  or    eax,eax
  jz    @@ret_false

  dec    eax
  mov    [@@len],eax
  xor    eax,eax
  mov    edx,ebx

@@scan:  mov    al,[byte edx]
  inc    edx
  cmp    al,0Dh
  je    short @@eol
  or    eax,eax
  jz    short @@exec
  jmp    short @@scan

@@eol:  mov    [byte edx - 1],0
  push    edx
  call    SendMessageA,      [@@history], LB_ADDSTRING, 0, ebx
  pop    edx
  mov    [byte edx - 1],0Dh
  inc    edx
  mov    ebx,edx
  jmp    short @@scan

@@exec:  call    SendMessageA,      [@@history], LB_ADDSTRING, 0, ebx
  lea    ebx,[@@buf]
  call    isc_dsql_exec_immed2,  offset status_vector,    
          offset hDataBase,    
          offset hTransaction,    
          [@@len], ebx, [dialect], 0, 0
  or    eax,eax
  jnz    short @@err_query

  call    SendMessageA,      [@@query], WM_SETTEXT, 0, offset @@zero
  call    SendMessageA,      [@@history], LB_ADDSTRING, 0, offset @@ok
  call    SendMessageA,      [@@history], LB_ADDSTRING, 0, offset @@zero
  pop    ebx
END_HANDLER    ret_false

@@err_query:    call    SendMessageA,      [@@history], LB_ADDSTRING, 0, offset @@error
  mov    [@@psv],offset status_vector

@@err_loop:    lea    edx,[@@psv]
  call    isc_interprete,      ebx, edx
  or    eax,eax
  jz    short @@end_err_loop
  call    SendMessageA,      [@@history], LB_ADDSTRING, 0, ebx
  jmp    short @@err_loop
@@end_err_loop:    call    SendMessageA,      [@@history], LB_ADDSTRING, 0, offset @@zero
  pop    ebx
  jmp    @@ret_false

MSG_HANDLER    IDC_COMMIT
  call    isc_commit_retaining,  offset status_vector,    
          offset hTransaction
END_HANDLER    ret_false

MSG_HANDLER    IDC_ROLLBACK
  call    isc_rollback_retaining,  offset status_vector,    
          offset hTransaction
END_HANDLER    ret_false

MSG_HANDLER    IDC_OK
  call    isc_commit_transaction,  offset status_vector,    
          offset hTransaction
  call    EndDialog,      [@@hDlg], 0
END_HANDLER    ret_false

endp    SessionProc

End    Start
Работа с Oracle значительно сложнее, Access я не использую. А Cache... это для мазохистов (IMHO).
Ответить с цитированием
  (#45 (permalink)) Старый
Anonymous
Guest
 
Сообщений: n/a
По умолчанию 23.12.2003, 02:47

Цитата:
Originally posted by Anonymous
[b]Ага.. А если поподробнее?
Примерчик и все такое?
Желательно Oracle, Cache ну и убогий Access..
Медаль уже в коробочке - ждет победителя..
Пример?! Пожалуйста. Это простая демонстрационная программка под Win32, которая позволяет создавать базу данных или соединиться с существующей базой данных, а также выполнить любой SQL-оператор (CREATE ..., ALTER ..., DROP ..., INSERT INTO ..., DELETE FROM ...). Единственное ограничение на исполнение операторов состоит в том, что не отображаются результаты выборки (оператор SELECT). Сделано это сознательно, поскольку в этом случае необходимо добавить работу с памятью, преобразование данных из различных форматов (целые, вещественные, даты и время, строки, BLObs и пр.). Наглядности это не добавит, но затруднит понимание исходного текста программы. В действительности, особых сложностей с реализацией оператора выборки нет (поверьте на слово или проверьте сами). Размер EXE-файла 8 Кб. Компилируется TASM, для линковки используется TLink. Диалоги сделаны в Visual Studio (rc & res файлы).
Код:
; =================================
;    Interbase API 02
;    written by Alexander Usoff
;    Jan. 1998 y.
;    for FIDO.ASM&WIN32
; =================================

; ---------------------------------
;    DB create & connect & job
; ---------------------------------
Ideal
P586
Radix    16
Model    flat

%NOINCL
include    "winconst.inc"
include    "winprocs.inc"
include    "winmacro.inc"
include    "intrbase.inc"
include    "resource.inc"

quota  =    27
MAX_SERVER    =    20
MAX_DATABASE    =    100
MAX_USER    =    20
MAX_PASSWORD    =    10
MAX_CHARSET    =    0Bh
SV_LENGTH    =    14; status vector length = 20 d

UDataSeg
hInst  dd    ?
dialect  dd    ?
server  db    MAX_SERVER + 1  dup    (?)
ALIGN 4
database    db    MAX_DATABASE + 1    dup    (?)
ALIGN 4
user  db    MAX_USER + 1  dup    (?)
ALIGN 4
password    db    MAX_PASSWORD + 1    dup    (?)
ALIGN 4
charset  db    MAX_CHARSET + 1  dup    (?)
ALIGN 4

DataSeg
hDatabase    dd    0
hTransaction    dd    0
status_vector    dd    SV_LENGTH dup (0)

CodeSeg
; Основная программа (8 строк) :)
Start:  call    GetModuleHandleA,    0
  mov    [hInst],eax

  call    DialogBoxParamA,    eax, IDD_IBLOGON,    
      0, offset IBLogonProc, 0
  or    eax,eax
  jz    short quit

  call    DialogBoxParamA,    [hInst], IDD_SESSION,    
      0, offset SessionProc, 0

  call    isc_detach_database,    offset status_vector,    
      offset hDatabase
quit:  call    ExitProcess,  0

public    stdcall  IBLogonProc
proc    IBLogonProc    stdcall
arg    @@hDlg    :dword,    @@msg    :dword,    @@wPar    :dword,    @@lPar    :dword
local    @@buf    :byte:170
uses    esi, edi

UDataSeg
@@server    dd    ?
@@database    dd    ?
@@protocol    dd    ?
@@user  dd    ?
@@password    dd    ?
@@dialect    dd    ?
@@charset    dd    ?

DataSeg
ALIGN    4
@@charset_str    db    'ASCII', 0
  db    'BIG_5', 0
  db    'CYRL', 0
  db    'DOS437', 0
  db    'DOS850', 0
  db    'DOS852', 0
  db    'DOS857', 0
  db    'DOS860', 0
  db    'DOS861', 0
  db    'DOS863', 0
  db    'DOS865', 0
  db    'EUCJ_0208', 0
  db    'GB_2312', 0
  db    'ISO8859_1', 0
  db    'KSC_5601', 0
  db    'NEXT', 0
  db    'NONE', 0
  db    'OCTETS', 0
  db    'SJIS_0208', 0
  db    'UNICODE_FSS', 0
  db    'WIN1250', 0
  db    'WIN1251', 0
  db    'WIN1252', 0
  db    'WIN1253', 0
  db    'WIN1254', 0, 0

@@dialect_str    db    '1', 0, '2', 0, '3', 0, 0
@@protocol_str    db    'TCP/IP', 0, 'NetBEUI', 0, 0

@@sql_createdb    db    @@len_createdb
  db    'CREATE DATABASE ', quota
@@len_createdb    =    $ - @@sql_createdb - 1

@@sql_dbuser    db    @@len_dbuser
  db    quota, ' USER ', quota
@@len_dbuser    =    $ - @@sql_dbuser - 1

@@sql_dbpswd    db    @@len_dbpswd
  db    quota, ' PASSWORD ', quota
@@len_dbpswd    =    $ - @@sql_dbpswd - 1

@@sql_dbpage    db    @@len_dbpage
  db    quota, ' PAGE_SIZE = 4096 DEFAULT CHARACTER SET '
@@len_dbpage    =    $ - @@sql_dbpage - 1

DlgVector    WM_INITDIALOG, WM_COMMAND

MSG_HANDLER    WM_INITDIALOG
  mov    edi,IDC_SERVER - 1
  mov    esi,offset @@server - 4

@@init_item:    inc    edi
  add    esi,4
  call    GetDlgItem,    [@@hDlg], edi
  mov    [dword esi],eax
  cmp    edi,IDC_CHARSET
  jb    short @@init_item

  call    SendMessageA,  [@@server], EM_LIMITTEXT, MAX_SERVER - 1, 0
  call    SendMessageA,  [@@database], EM_LIMITTEXT, MAX_DATABASE - 1, 0
  call    SendMessageA,  [@@user], EM_LIMITTEXT, MAX_USER - 1, 0
  call    SendMessageA,  [@@password], EM_LIMITTEXT, MAX_PASSWORD - 1, 0

  mov    edi,[@@charset]
  mov    esi,offset @@charset_str
  call    FillCombobox    stdcall,    10

  mov    edi,[@@dialect]
  call    FillCombobox    stdcall,    2

  mov    edi,[@@protocol]
  call    FillCombobox    stdcall,    1

END_HANDLER    ret_true

MSG_HANDLER    WM_COMMAND
CmdVector    IDC_DBCREATE, IDC_DBCONNECT, IDC_LOGCANCEL
END_HANDLER

MSG_HANDLER    IDC_DBCREATE
; read fields
; create database
; detach database
  mov    edi,offset @@create_database

@@read_logparams:
  call    SendMessageA,  [@@server], WM_GETTEXT, MAX_SERVER, offset server + 1
  mov    [server],al
  call    SendMessageA,  [@@database], WM_GETTEXT, MAX_DATABASE, offset database + 1
  mov    [database],al
  call    SendMessageA,  [@@user], WM_GETTEXT, MAX_USER, offset user + 1
  mov    [user],al
  call    SendMessageA,  [@@password], WM_GETTEXT, MAX_PASSWORD, offset password + 1
  mov    [password],al
  call    SendMessageA,  [@@charset], WM_GETTEXT, MAX_CHARSET, offset charset + 1
  mov    [charset],al
  call    SendMessageA,  [@@dialect], CB_GETCURSEL, 0, 0
  inc    eax
  mov    [dialect],eax
  jmp    edi

@@create_database:
  lea    edi,[@@buf]
  mov    edx,edi
  xor    ecx,ecx
  cld

  CopyPStr    offset @@sql_createdb

  mov    cl,[server]
  or    ecx,ecx
  jz    short @@copy_db

  call    SendMessageA,  [@@protocol], CB_GETCURSEL, 0, 0
  xor    ecx,ecx
  or    eax,eax
  mov    al,':'
  jnz    short @@tcpip

  mov    [word edi],''
  add    edi,2
  mov    al,''

@@tcpip:    CopyPStr    offset server
  stosb

@@copy_db:    ConcatPStr    database, @@sql_dbuser, user, @@sql_dbpswd, password, @@sql_dbpage, charset

  mov    al,';'
  stosb
  sub    edi,edx

  call    isc_dsql_exec_immed2,    offset status_vector,    
      offset hDatabase,    
      offset hTransaction,    
      edi, edx, [dialect],    
      0, 0
  or    eax,eax
  jnz    @@err_createdb
  call    isc_detach_database,    offset status_vector,    
      offset hDatabase
END_HANDLER    connect

MSG_HANDLER    IDC_DBCONNECT
; read fields
; fill dpb
; connect database
  mov    edi,offset @@connect
  jmp    @@read_logparams

@@connect:    lea    edi,[@@buf]
  mov    edx,edi
  mov    [dword edi],(((((0F0 shl 8) + 1) shl 8) + isc_dpb_num_buffers) shl 8) + isc_dpb_version1
  add    edi,4
  mov    [word edi],isc_dpb_force_write
  add    edi,2
  xor    ecx,ecx
  cld
  mov    [byte edi],isc_dpb_lc_ctype
  mov    esi,offset charset
  inc    edi
  mov    cl,[byte esi]
  inc    ecx
  rep    movsb

  mov    [byte edi],isc_dpb_user_name
  mov    esi,offset user
  inc    edi
  mov    cl,[byte esi]
  inc    ecx
  rep    movsb

  mov    [byte edi],isc_dpb_password
  mov    esi,offset password
  inc    edi
  mov    cl,[byte esi]
  inc    ecx
  rep    movsb

  sub    edi,edx
  call    isc_attach_database,    offset status_vector,  
      ecx, offset database + 1,    
      offset hDatabase, edi, edx
  or    eax,eax
  jnz    short @@err_attach

  mov    eax,1
END_HANDLER    short    end

MSG_HANDLER    IDC_LOGCANCEL
  xor    eax,eax
@@end:  call    EndDialog,    [@@hDlg], eax
END_HANDLER    ret_false

@@err_createdb:
@@err_attach:
  jmp    @@ret_false

endp    IBLogonProc

proc    FillCombobox    stdcall
arg    @@index    :dword
; edi = id combobox item
; esi = offset string list

@@1:  call    SendMessageA,    edi, CB_ADDSTRING, 0, esi
  xor    eax,eax
@@2:  mov    al,[byte esi]
  inc    esi
  or    eax,eax
  jnz    short @@2
  mov    al,[byte esi]
  or    eax,eax
  jnz    short @@1
  call    SendMessageA,    edi, CB_SETCURSEL, [@@index], 0
  inc    esi
  ret
endp    FillCombobox

public    stdcall  SessionProc
proc    SessionProc    stdcall
arg    @@hDlg    :dword,    @@msg    :dword,    @@wPar    :dword,    @@lPar    :dword
local    @@psv    :dword,    @@len    :dword,    @@buf    :byte:400

UDataSeg
@@query  dd    ?
@@history    dd    ?

DataSeg
ALIGN    4
tpb  db    isc_tpb_version3
  db    isc_tpb_write
  db    isc_tpb_read_committed
  db    isc_tpb_no_rec_version
  db    isc_tpb_wait
LENGTH_TPB    =    $ - tpb
@@ok  db    'Ok.'
@@zero  db    0
@@error  db    'Error!', 0

DlgVector    WM_INITDIALOG, WM_COMMAND

MSG_HANDLER    WM_INITDIALOG
  call    GetDlgItem,      [@@hDlg], IDC_QUERY
  mov    [@@query],eax
  call    GetDlgItem,      [@@hDlg], IDC_HISTORY
  mov    [@@history],eax

  call    isc_start_transaction,  offset status_vector,    
          offset hTransaction,    
          1, offset hDataBase,    
          LENGTH_TPB, offset tpb
END_HANDLER    short    ret_false

MSG_HANDLER    WM_COMMAND
CmdVector    IDC_RUN, IDC_COMMIT, IDC_ROLLBACK, IDC_OK
END_HANDLER    short    ret_false

MSG_HANDLER    IDC_RUN
  push    ebx
  lea    ebx,[@@buf]
  call    SendMessageA,      [@@query], WM_GETTEXT, 400, ebx
  or    eax,eax
  jz    @@ret_false

  dec    eax
  mov    [@@len],eax
  xor    eax,eax
  mov    edx,ebx

@@scan:  mov    al,[byte edx]
  inc    edx
  cmp    al,0Dh
  je    short @@eol
  or    eax,eax
  jz    short @@exec
  jmp    short @@scan

@@eol:  mov    [byte edx - 1],0
  push    edx
  call    SendMessageA,      [@@history], LB_ADDSTRING, 0, ebx
  pop    edx
  mov    [byte edx - 1],0Dh
  inc    edx
  mov    ebx,edx
  jmp    short @@scan

@@exec:  call    SendMessageA,      [@@history], LB_ADDSTRING, 0, ebx
  lea    ebx,[@@buf]
  call    isc_dsql_exec_immed2,  offset status_vector,    
          offset hDataBase,    
          offset hTransaction,    
          [@@len], ebx, [dialect], 0, 0
  or    eax,eax
  jnz    short @@err_query

  call    SendMessageA,      [@@query], WM_SETTEXT, 0, offset @@zero
  call    SendMessageA,      [@@history], LB_ADDSTRING, 0, offset @@ok
  call    SendMessageA,      [@@history], LB_ADDSTRING, 0, offset @@zero
  pop    ebx
END_HANDLER    ret_false

@@err_query:    call    SendMessageA,      [@@history], LB_ADDSTRING, 0, offset @@error
  mov    [@@psv],offset status_vector

@@err_loop:    lea    edx,[@@psv]
  call    isc_interprete,      ebx, edx
  or    eax,eax
  jz    short @@end_err_loop
  call    SendMessageA,      [@@history], LB_ADDSTRING, 0, ebx
  jmp    short @@err_loop
@@end_err_loop:    call    SendMessageA,      [@@history], LB_ADDSTRING, 0, offset @@zero
  pop    ebx
  jmp    @@ret_false

MSG_HANDLER    IDC_COMMIT
  call    isc_commit_retaining,  offset status_vector,    
          offset hTransaction
END_HANDLER    ret_false

MSG_HANDLER    IDC_ROLLBACK
  call    isc_rollback_retaining,  offset status_vector,    
          offset hTransaction
END_HANDLER    ret_false

MSG_HANDLER    IDC_OK
  call    isc_commit_transaction,  offset status_vector,    
          offset hTransaction
  call    EndDialog,      [@@hDlg], 0
END_HANDLER    ret_false

endp    SessionProc

End    Start
Работа с Oracle значительно сложнее, Access я не использую. А Cache... это для мазохистов (IMHO).
Ответить с цитированием
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Появилось окно с ошибкой: "Insert the "Tray App" disk and click OK". Anita_2 Техническая поддержка 6 14.12.2014 14:20
Ставлю систему "с нуля" после сбоя. Какие "работы" по тестированию железа полезны? russcand Любые вопросы от новичков 14 01.09.2011 00:27
Инструкция по адресу "0x436b10f" обратилась к памяти "0x03793dac". ВИРУС???? skazka Windows XP 5 21.03.2010 01:21
помогите выбрать "ASRock P4i45PE" или "GigaByte GA-8PE800" Константин Материнские платы 2 06.12.2009 15:21
Как исправить "attempt to store duplicate value in unique index "RDB$INDEX_5" ?" devo4ka-nimfetka Другие СУБД 1 16.04.2009 09:58
Закрываются игры, появляется ошибка: "0xbe8787ba" или "0x3e89ce89" . ASUSTeK Техническая поддержка 42 19.02.2009 01:38
После подключения кнопок "power" и "reset" компьютер перестал включаться. Лаборант-Шурупов Любые вопросы от новичков 1 25.01.2009 15:15
Добавить кнопки "свернуть" и "восстановить" к окну готового dialog-based приложения Lesat Visual C++ 2 07.01.2006 04:34
Как сделать чтобы вместо кнопок "Да" и "Нет" высвечивалось украинсие "Так" и "Ні" Форсаж Delphi 5 19.07.2003 19:30



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов