UWSC 掲 示 板
投稿時に「証明書が不正です」と出る場合には、JavaScriptをオンにしてください
動作不具合での質問の場合には環境(OS,IEのバージョン等)の表記もしてください
タイトルは質問内容を表したものにしてください
ネットゲーム関係の質問はご遠慮ください

タイトル (必須)
 お名前 (必須)
文字色
設定保存削除/編集パス  

CREATEFORM()かstatus()のいずれかで、大きさが間違っていると思われます。 / 森
下記スクリプトを実行した際、段々とウインドウが小さくなっていきますので、
・CREATEFORM()した時に指定よりも小さくなっている
・status()で取得した値が実際よりも小さい
のいずれかになっていると思います。
------------------------------------------
W = 300
H = 300
for i = 1 to 10
 CREATEFORM("about:blank", "TEST" , TRUE ,, W, H)
 id = getId(GET_FORM_WIN)
 W = status(id , ST_WIDTH)  // フォームウィンドウの幅
 H = status(id , ST_HEIGHT) // フォームウィンドウの高さ
 sleep(1)
next
------------------------------------------
UWSC Pro Ver 5.3.0.2
Windows10です。

No.4344 2017/08/22(Tue) 17:49:40

Re: CREATEFORM()かstatus()のいずれかで、大きさが間違っていると思われます。 NEW / umiumi
対処します。
No.4347 2017/08/24(Thu) 00:29:03
IEのサイトとメモ帳とエクセルを開いている状態で特定のキーを押す事で特定の処理をさせる方法 / ゆう
下記のコードで文字をコピーしてNを押すとエクセルの最終行に貼付け、NキーでB列の最終行に貼付け、SHIFTを押すとIEのタイトルバークリック、ALTキーを押すとクリップボードに文字がなければ、メモ帳をクリック、クリップボードに文字があればコピーしたのを貼付けという処理をしたいのですが、クリップボードに文字がある状態でALTキーを押してメモ帳に貼付けした後、SHIFTを押してもIEのタイトルバーをクックする処理にならず反応がなく、クリップボードに文字がない状態でALTキーを押してメモ帳をクリックする処理にならず反応がありません。

スクリプト起動後、クリップボードに文字がある状態でALTキーを押さず、SHIFTキーやALTキーでのメモ帳クリックとかも問題なくできています。
エクセルの最終行貼付けは、問題なくできています。したい処理がクリップボードに文字がある状態でALTキーを押した後であっても、SHIFTキーやALTキーの処理させたいのですができません。
どこが間違っているのでしょうか?


excel2 = GETACTIVEOLEOBJ("Excel.Application")
o_sheet = excel2.ActiveSheet

yA = sub_getBlankRowNumber1a(o_sheet, 1)  //A列の現在行(空欄行)
yB = sub_getBlankRowNumber1a(o_sheet, 2)  //B列の現在行(空欄行)


while True
  sleep(0.2)
  
  ifb getkeystate(VK_N) then //VK_ADD
    x = 1
  elseif getkeystate(VK_M) then //VK_MULTIPLY
    x = 2
  elseif getkeystate(VK_SHIFT) then //メモ帳移動
sethotkey(VK_SHIFT, MOD_SHIFT, "proc2z")

  elseif getkeystate(VK_ALT) then //VK_MULTIPLY
  x = 3
sethotkey(VK_ALT, MOD_ALT, "proc1z")

  else
    continue  
  endif
  
      
 ss = GETSTR(0)
  ifb (ss <> "")  //クリップボードにある場合のみ処理する
    ifb (1 = x) then
      y = yA
    Excel2.ActiveSheet.Cells[y, x].Value = ss
    y = y + 1
      yA = y
    elseif (2 = x) then
      y = yB
      Excel2.ActiveSheet.Cells[y, x].Value = ss
      yy = y + 1
      yB = y
    elseif (3 = x) then
    SENDSTR(0, "") // クリップボードをクリア
else
continue
    endif
        
  endif
wend



procedure proc1z

a=getstr(0)
a=length(a)

if a=0 then
nID =GETID("無題 - メモ帳","Notepad")//ウィンドウ指定

MMV(STATUS(nID, ST_CLX)+STATUS(nID, ST_CLWIDTH)/2, STATUS(nID, ST_CLY)+STATUS(nID, ST_CLHEIGHT)/2)
else
ida = GETID("メモ帳")

MOUSEORG(GETCTLHND(ida,"edit"), 2)
tesa = GETSTR(0)
SENDSTR(ida,tesa+"<#CR>")
endif

fend

procedure proc2z

id1=getid("Internet Explorer")
x1 = status(id1, ST_x) + status(id1, ST_WIDTH) / 2
y1 = status(id1, ST_Y) + 10
btn(LEFT, CLICK, x1, y1)
fend


//下から上に探して最初の空欄がある行番号を返す
function sub_getBlankRowNumber1a(oSheet, iColumnNumber)
  dim i_bottomRow = oSheet.Rows.Count
  dim o_range   = oSheet.Cells(i_bottomRow, iColumnNumber)
  
  dim xlUp = -4162
  o_range = o_range.End(xlUp)     //Ctrl + ↑ と同じ操作
  
  ifb (empty <> o_range.Value) then  //空欄でなければ
    o_range = o_range.Offset(1, 0)  //一つ下のセル
  endif
  
  result = o_range.Row
fend

No.4346 2017/08/22(Tue) 23:37:45
IEのタイトルバーをクリックする方法 / ゆう
IEのタイトルバーをクリックする方法ないでしょうか?
clkitemでできるような気がするのですがいまいち使い方が分かりません。
btn関数で直接、座標を指定してやるのも考えたのですがそれよりも精度の高いやり方ないでしょうか?

No.4340 2017/08/22(Tue) 15:31:42

Re: IEのタイトルバーをクリックする方法 / stuncloud
> clkitemでできるような気がするのですがいまいち使い方が分かりません。
ちょっとダメな気がします

> btn関数で直接、座標を指定してやる
しかないでしょう
タイトルバーのサイズってそうそう変わらないのでstatus(id, ST_X)とstatus(id, ST_Y)に少し数値を足してやれば精度は十分なんじゃないでしょうか
以下でだいたいタイトルバーのまんなかをクリックします

x = status(id, ST_x) + status(id, ST_WIDTH) / 2
y = status(id, ST_Y) + 10
// mmv(x, y) // ポインタで座標確認
btn(LEFT, CLICK, x, y)

# しかしなぜタイトルバーをクリックしたいんでしょうか…?

No.4342 2017/08/22(Tue) 16:18:45

Re: IEのタイトルバーをクリックする方法 / ゆう
stuncloud様、希望通りの処理ができました、ありがとうございます。
IEのタイトルバーをクリックする事でページの下にスクロールしたいからです。
タイトルバーよりも下だとリンクがあった場合リンク先に飛んでしまいますので、タイトルバーなんです。ctrlwinでアクティブしてもうまくいかなかったので、タイトルバークリックがベストです。

No.4345 2017/08/22(Tue) 20:23:48
Firefoxでリンクの表示から取得したい / MTDT
Firefoxの最新版でサイトを開いて、ページのリンクの上にマウスカーソルを置くと、左下にそのURLが表示されるので、それを取得したいです

POSACC関数の、
全てのモードで
IDは、0 と、GETID("Mozilla Firefox") の 2つ
全部で、20パターンを試してみましたが取得できませんでした

あの表示というのは、特殊なものなのでしょうか

URLは、右クリックから取得できますが
左下に表示されるものを取得したいです

もしくは、IEやChromeでも同じように左下に表示されるので、こちらの2つなら分かる、という方でもお願いします

No.4326 2017/08/19(Sat) 05:22:38

Re: Firefoxでリンクの表示から取得したい / stuncloud
IEならばステータスバーを表示しているのが条件になりますが、getitem(id, ITM_STATUSBAR) すれば ALL_ITEM_LIST[0] がリンクにマウスオーバーで表示されるURLです

// URLが表示されたらprintする
while TRUE
 if getitem(id, ITM_STATUSBAR) then
  if length(ALL_ITEM_LIST[0]) then
   print ALL_ITEM_LIST[0]
   break
  endif
 endif
 sleep(0.1)
wend

No.4343 2017/08/22(Tue) 16:36:07
WEBサイトからファイルのダウンロード動作が不安定 / VBA-IE
EXCEL VBAでWEBサイトからCSVファイルをダウンロード、名前を付けて保存させる処理をさせたいと思っています。
具体的には、@CSVダウンロードボタンをクリックした後、Aファイルを開く 保存 キャンセル の表示後、B保存の右横の▼をクリックし、C保存、名前を付けて保存、保存して開くを表示後、D名前を付けて保存をクリックする処理です。
ネットで調べたところ、図の様な通知バー表示以降の処理(前記A以降)はVBAのみでは実現難しく、UWSCを使う方法を薦めるとの回答を見つけ、UWSCサンプルにあった「IE にてファイルのダウンロード処理  #N58」を参考に下記の通りスクリプトを組んで実行していますが、これでも動作が不安定で困っています。

<問題点>
正常にダウンロードでき保存できる場合と、UWSCの配列オーバエラー(下図)となる場合がある。
PRINT文を挿入しトレースをした結果、おそらくエラーは、UWSCスクリプト7行の
PRINT ClkItem(ieid, "\保存\名前を付けて保存", CLK_BTN)
¥保存¥名前を付けて保存のボタンクリックが出来ていない(False)ものと推定しています。

VBAの処理からUWSCを実行する手前(Sleep7000)、その他の各所にもWait処理(Sleep)を入れて調整していますが、未だ不安定な状況です。特にUWSC実行する手前のWait処理(Sleep7000)をなくすとエラー(ダウンロード失敗、その後UWSCの配列オーバーエラー)になるので、これがヒントにならないでしょうか。

保存、名前を付けて保存のボタンクリックの安定しない原因、およびその対策をお教え願います。

<エラー>
UWSC-DL1.uws
変数:ALL_ITEM_LIST配列をオーバーしてます
47行目:IF POS("ダウンロードが完了"、ALL_ITEM_LIST[N-1])>0

<VBAソース(関連部分のみ>
'CSVダウンロードボタンをクリック
Call tagClick(objIE, "button", "CSVダウンロード")


'ここでobjIEを喪失していると想像
Sleep 2000 '十分な待機時間(例えば2秒)を確保(APIのSleep関数)
Set objIE = 最新画面 '最新のオブジェクトを取得する
If objIE Is Nothing Then MsgBox "異常発生": Exit Sub '念のため
Call ieCheck(objIE) '念のため

'ここで通知バーを表示しているhpをアクティブに
'ウィンドウが最小化されているかのチェック
If Not IsIconic(objIE.hWnd) = 0 Then '0以外:最小化されている
ShowWindowAsync objIE.hWnd, SW_RESTORE
End If
'IEを最前面に表示
SetForegroundWindow (objIE.hWnd)

'
'通知バー内保存−名前を付けて保存ボタンをクリックする処理(UWSC使用)
'
'UWSCとの同期用ファイル初期化(doukiファイル サイズ0に初期化)
Application.DisplayAlerts = False
Shell "C:\Windows\System32\cmd.exe /C Copy c:\TEST\zero.txt c:\TEST\douki.txt"
Application.DisplayAlerts = True

Sleep 7000 'テスト用 7秒待ち

Dim Fname As String
Shell "C:\UWSC\uwsc5302\UWSC.exe c:\TEST\DL1.uws " & DLfile

'UWSC処理完了チェック(同期用ファイルサイズが0でなくなる時)
Dim DF_size As Long
Dim LC As Integer '繰返し回数(回数オーバはタイムアウトエラー)

Sleep 10000 'UWSC処理完了待ち 10秒

LC = 10 '初期化(その後1秒ごと10回超え、合計20秒でタイムアウトとする)

Pro9:
DF_size = FileLen(ThisWorkbook.Path & "\Douki.txt")
If Not DF_size > 0 Then
Sleep 1000 '1秒Wait(1秒毎のファイルサイズチェック、0でなくなれば終了)
LC = LC - 1
If LC = 0 Then
MsgBox "タイムアウトエラー 異常発生"
GoTo E_Pro1:
End If
GoTo Pro9:
End If

<UWSCスクリプト>
// IE(IE9以上) にてダウンロードのページが開いている事(http://www.uwsc.info/download.html)
ieid = GETID("Internet Explorer", "IEFrame")
PRINT (1)
//PRINT (ClkItem(ieid, "保存", CLK_LIST or CLK_SHORT)) // 不要(正常時もエラー時もここはFalse)、保存をクリック、リストボックス、文字省略指定: 部分一致にて検索
PRINT (2)
//sleep(5) // 不要(前の"保存"クリック不要に伴い)、間が必要
PRINT ClkItem(ieid, "\保存\名前を付けて保存", CLK_BTN) // '保存'スプリットボタンの '名前を付けて保存'をクリック
PRINT (3)
setNameFileDlg(PARAM_STR[0], ".csv") // ファイル名 DLfile.cvs (DLfileは変数)にてダウンロード
PRINT (4)
sfid = GETID("名前を付けて保存の確認", "#32770",5) //上書き確認、上書き実行
PRINT (5)
if sfid < then EXIT //通知がないケースは抜ける
PRINT (ClkItem(sfid, "はい" , CLK_SHORT)) //上書き指示
Sleep(1) //デバグ用
closeDlg(ieid) // ダウンロード終了確認
PRINT (6)
//Sleep(20) //デバグ用(ブレーク)
//メイン処理との同期用ファイルに書き込む
ID = FOPEN("c:\Douki.txt", F_WRITE)
FPUT(ID,"正常終了") //正常終了を書込む
FCLOSE(ID)
EXITEXIT //UWSCスクリプト終了
// '名前を付けて保存'ダイアログに名前を設定し保存(fname:保存ファイル名、extens:拡張子)
Function setNameFileDlg(fname, extens)
Result = False
id = GETID("名前を付けて保存", "#32770",5) //#32770はダイアログのクラス名
if id < then Exit
Sleep(1)
pp = -1
for n = 1 to 3 // 検索項目が付加される事がある為Edit順番を確認
ifb Pos(extens, GetStr(id, n))>0
pp = n
break
endif
next
if pp < 0 then Exit
SendStr(id, fname + extens, pp, True)
// Result = ClkItem(id, "保存", CLK_BTN or CLK_MUSMOVE) //戻り値
PRINT (ClkItem(id, "保存", CLK_BTN or CLK_MUSMOVE)) //戻り値
Fend
// ダウンロード終了確認、フォルダーを開く
Procedure closeDlg(ieid)
while True
Sleep(1)
n = GETITEM(ieid, ITM_ACCTXT)
if Pos("ダウンロードが完了", ALL_ITEM_LIST[n-1])>0
// CLKITEM(ieid, "フォルダーを開く", CLK_BTN) //不要(フォルダ開く)
Exit
endif
Wend
Fend

No.4339 2017/08/22(Tue) 15:09:44

Re: WEBサイトからファイルのダウンロード動作が不安定 / stuncloud
> n = GETITEM(ieid, ITM_ACCTXT)
> if Pos("ダウンロードが完了", ALL_ITEM_LIST[n-1])>0


でnが0になった場合にエラーになります (ALL_ITEM_LIST[-1] になって配列の範囲を越える
nが0の場合は処理をスキップする等してください

あとVBAのコードは書かなくていいです

No.4341 2017/08/22(Tue) 16:09:04
(No Subject) / あ
IESETDATAを使ってIE上の入力フォームに入力するとき、変数を含む複数行を入力したいときはどうすればいいですか?
例えば、
data
name
age
のように入力したいです

IESETDATA
IESETDATA
IESETDATA
のように記述すると毎回リセットして入力されてしまいます

No.4338 2017/08/22(Tue) 11:01:02
Excelでソート / あ
uwscを使ってExcelのデータを昇順にしたいです
あらかじめクイックアクセスツールバーに昇順を設定しておりALT+6で昇順になるはずなのですがUWSCでKBD関数を用いて命令しても反応無しです
他に方法はありますでしょうか?

No.4331 2017/08/20(Sun) 09:39:58

Re: Excelでソート / あ
sckey関数も無理でした
No.4332 2017/08/20(Sun) 09:46:34

Re: Excelでソート / あ
EXCEL.Range("A1").Select
SCKEY(EXCEL, VK_ALT, VK_6)

みたいな感じで命令するとエラー音が鳴ります

No.4333 2017/08/20(Sun) 20:38:39

Re: Excelでソート / あ
どうやらUWSC.exeに対してALT+6を送るようになっているみたいです
どうやってExcelに送れますか?

No.4334 2017/08/20(Sun) 20:42:31

Re: Excelでソート / あ
分かる人いませんか?
No.4335 2017/08/20(Sun) 22:40:53

Re: Excelでソート / yanyan
SCKEYは、COMオブジェクトではなく、window-識別IDに対して送ります。

//余計なことですが、下記はCOMを使用したExcelソート例です。

XL = CreateOLEObj("Excel.Application")
XL.Workbooks.Add
XL.Visible = True
XL.Cells[1,1] = "NO"
XL.Cells[1,2] = "value"  
for a= 2 to 100
XL.Cells[a,1] = a
XL.Cells[a,2] = random()
next

xl.Activesheet.Sort.SortFields.Clear
xl.Activesheet.Sort.SortFields.Add( Key:= xl.activesheet.range("B2:B100") , SortOn:= 0 ,Order:=1, DataOption:=1)
With xl.Activesheet.Sort
.SetRange(rng:= xl.activesheet.range("a1:B100"))
.Header = 1
.MatchCase = False
.Orientation = 1
.SortMethod = 1
.Apply
EndWith

No.4336 2017/08/21(Mon) 10:01:05
起動しなくなります / BOSS
エラーが出たらOKボタンを押して起動させますが、1〜2日すると動かなくなります。
「くま.exe」を再起動させても全く動かないですが、同じものの「くま.uws」一度動かすと「くま.exe」が再び動くようになります。
原因はなんでしょうか。



while true

ifb GetID("くま","TUmsgDlg_uwsc") <> -1
clkitem(GetID("くま","TUmsgDlg_uwsc"),"OK",CLK_BTN)
endif

ifb GETID("くま","TUScript") = -1
REPEAT
gettime()
print G_TIME_MM + "/" + G_TIME_DD2+" "+G_TIME_HH + ":" + G_TIME_NN2 +"<#CR>"+"落ちてたから起動するよ"
EXEC("C:\Users\R\Desktop\くま.exe")
sleep(3)
UNTIL GETID("くま","TUScript") <> -1
endif

sleep(10)
wend

No.4329 2017/08/19(Sat) 17:36:59

Re: 起動しなくなります / BOSS
訂正します。

1〜2日すると下に記述の.exeが動かなくなります。
下に記述の.exeを再起動させても全く動かないですが、下に記述の.uws一度動かすと再び動くようになります。
原因はなんでしょうか。


while true

ifb GetID("くま","TUmsgDlg_uwsc") <> -1
clkitem(GetID("くま","TUmsgDlg_uwsc"),"OK",CLK_BTN)
endif

ifb GETID("くま","TUScript") = -1
REPEAT
gettime()
print G_TIME_MM + "/" + G_TIME_DD2+" "+G_TIME_HH + ":" + G_TIME_NN2 +"<#CR>"+"落ちてたから起動するよ"
EXEC("C:\Users\R\Desktop\くま.exe")
sleep(3)
UNTIL GETID("くま","TUScript") <> -1
endif

sleep(10)
wend

No.4330 2017/08/19(Sat) 18:56:19
名前の右側にスペースを加えて文字数を揃えたい / BOSS
名前の後ろにスペースを加えて横の数字が揃うようにしたいです
良い方法はありますでしょうか

浦浜圭一郎  10
哀川譲    20
朝比奈あすか 30
阿刀田高   40

No.4320 2017/08/18(Fri) 16:29:26

Re: 名前の右側にスペースを加えて文字数を揃えたい / stuncloud
format()を使うのが簡単ですね
例が全角スペースで埋まってたのでサンプルもそうしています
加工前のデータは扱いやすさから連想配列にしています

hashtbl temp
temp["浦浜圭一郎"] = 10
temp["哀川譲"] = 20
temp["朝比奈あすか"] = 30
temp["阿刀田高"] = 40

len = 7 //スペースを含めた文字の長さ

for key in temp
 // format()で必要な数だけ全角スペースを入れる
 print key + format(" ", len - length(key)) + temp[key]
next

スペースでの右寄せ・左寄せはよくある質問なので実現方法もそのサンプルもたくさん過去ログにあると思います
この掲示板の下の方にある過去ログ検索ツールで探してみてください

No.4322 2017/08/18(Fri) 17:28:41

Re: 名前の右側にスペースを加えて文字数を揃えたい / しろまさ
最近のOSはプロポーショナルフォント標準ですので等幅フォントを指定する必要があります。
ご存知でしたら無視して下さい^^

Option DEFAULTFONT = "MS ゴシック"

No.4327 2017/08/19(Sat) 09:33:45
C++ DLL 関数から文字列を返す / vusd
私のプロジェクトでは、このメソッドを使用してDLL関数から文字列を返す:
In my project, I use this method to return string from my DLL function:

方法/Method 1:
[C++]
#include <string.h>
char *temp_buffer = nullptr;

// Join s1 + s2 as new string
extern "C" __declspec(dllexport) const char* JoinString(const char* s1, const char* s2) {
temp_buffer = new char[strlen(s1) + strlen(s2) + 1];
strcpy(temp_buffer, s1);
strcat(temp_buffer, s2);

return temp_buffer;
}

extern "C" __declspec(dllexport) bool FreeStringResource() {
if (temp_buffer != nullptr) {
delete[] temp_buffer;
return true;
}
return false;
}
[/C++]

質問/Question 1:

私が知っているように、文字列リソースを解放するのはプロバイダの責任です。 だから私は、関数が "temp_buffer"を返した後、UWSCはこのデータに新しい文字列ベースを割り当てますが、この文字列リソースを解放しないと思います。 これは本当ですか?
As I know, it is responsibility of the provider to free the string resource. So I think after the function returned "temp_buffer", UWSC will allocate new string base on this data, but it will not free this string resource. Is this true?

したがって、FreeStringResource()関数を以下のように呼び出すと、後で文字列を解放する方法が必要になります。
So, we need some how free the string later, as call the function FreeStringResource() like below:

[uws]
DEF_DLL JoinString(string,string):string:uwsc.utils.dll
DEF_DLL FreeStringResource():boolean:uwsc.utils.dll
print JoinString("abc", "123")
FreeStringResource()
print JoinString("1111", "2222")
FreeStringResource()
[/uws]


上記の問題を回避するために、私は以下の方法を使用します:
上記の問題を回避するために、私は以下の方法を使用します:

方法/Method 2:
[C++]
#include <string>
std::string temp_buffer;
// Join s1 + s2 as new string
extern "C" __declspec(dllexport) const char* JoinString(const char* s1, const char* s2) {
temp_buffer = s1;
temp_buffer += s2;
return temp_buffer.c_str();
}
[/C++]
このメソッドを使用すると、文字列バッファはstd :: stringクラスによって管理され、リソースを手動で解放する必要はありません\
When using this method, the string buffer is managed by std::string class and we no need to manual free the resource anymore

質問/Question 2:
上記の関数はスレッドセーフではないので、複数のUWSCスレッドで使用することはできませんが、それは本当ですか? UWSCは各スレッドごとにDLLをロードしますか? 次の例はスレッドセーフではありません。コマンド "temp_buffer = s1;" 同時に2つのスレッドで呼び出すことができます
The function above is still non-thread safe, so we can't use it in multiple UWSC thread, is that true? Does UWSC load DLL per each thread? The example below is not thread safe, because the command "temp_buffer = s1;" can be called in 2 thread at the same time:
[uws]
DEF_DLL JoinString(string,string):string:uwsc.utils.dll
Thread F_Thread_1()
Thread F_Thread_2()

procedure F_Thread_1()
print JoinString("abc", "123")
fend
procedure F_Thread_2()
print JoinString("1111", "2222")
fend
[/uws]


この関数はスレッドセーフなバージョンに修正できますが、後でリソースを解放する必要があります。
We can fix this function to thread safe version, but it still need to free the resource later:

方法/Method 3:
[C++]
#include <string.h>
// Join s1 + s2 as new string
extern "C" __declspec(dllexport) const char* JoinString(const char* s1, const char* s2, char* &temp_buffer) {
temp_buffer = new char[strlen(s1) + strlen(s2) + 1];
strcpy(temp_buffer, s1);
strcat(temp_buffer, s2);

return temp_buffer;
}

extern "C" __declspec(dllexport) bool FreeStringResource(char *temp_buffer) {
if (temp_buffer != nullptr) {
delete[] temp_buffer;
return true;
}
return false;
}
[/C++]
[uws]
DEF_DLL JoinString(string,string,var hwnd):string:uwsc.utils.dll
DEF_DLL FreeStringResource(hwnd):boolean:uwsc.utils.dll
Thread F_Thread_1()
Thread F_Thread_2()

procedure F_Thread_1()
dim hwnd
print JoinString("abc", "123", hwnd)
FreeStringResource(hwnd)
fend
procedure F_Thread_2()
dim hwnd
print JoinString("1111", "2222", hwnd)
FreeStringResource(hwnd)
fend
[/uws]


現在、この関数を実装する別の方法が見つかりました:
Currently, I found another way to implement the function:

方法/Method 4:
[C++]
#include <string.h>
// Join s1 + s2 as new string
extern "C" __declspec(dllexport) bool JoinString(const char* s1, const char* s2, char* result) {
strcpy(result, s1);
strcat(result, s2);
return true;
}
[/C++]
[uws]
DEF_DLL JoinString(string,string,var string):boolean:uwsc.utils.dll
dim s = ""
print JoinString("abc", "123", s)
print s
[/uws]


質問/Question 3:
現時点では、上記の例はうまくいきますが、正しいとメモリが安全かどうかはわかりません。 例、strlen(s1)= strlen(s2)= 1000000、 "strcpy"と "strcat"はメモリからデータを書き出しますか?
Currently, the above example work, but I'm not sure does it is correct and memory safe. Example, strlen(s1) = strlen(s2) = 1000000, does "strcpy" and "strcat" write data out of memory?

誰でも助けてくれてありがとう

No.4309 2017/08/16(Wed) 17:24:11

Re: C++ DLL 関数から文字列を返す / vusd
https://stackoverflow.com/questions/18727022/access-array-beyond-the-limit-in-c-and-c
このページでは、制限を超えるアクセスC / C ++配列は未定義の動作だと言われていますので、方法4は間違っていると思います
As this page say that access C/C++ array beyond the limit is Undefined behavior, I think that Method 4 is not correct

No.4310 2017/08/16(Wed) 23:31:24

Re: C++ DLL 関数から文字列を返す / しゅん
英語は苦手、、、。

Answer 1. true.
Answer 2. I don't know. Perhaps, UWSC load DLL per each process.
Answer 3. Not safe. Allocate memory with the UWSC script.
[UWS]
DEF_DLL JoinString(string,string,var string):boolean:uwsc.utils.dll
dim s = FORMAT(CHR(0), 3 + 3 + 1)
print JoinString("abc", "123", s)
print s
[UWS]

No.4315 2017/08/17(Thu) 14:00:31

Re: C++ DLL 関数から文字列を返す / vusd
あなたのお手伝いをありがとう

I try print pointer of global variable in DLL in multiple UWSC thread and all are the same value
[C++]
int global_var;
extern "C" __declspec(dllexport) void* GetPointer() {
return &global_var;
}
[/C++]
[uws]
DEF_DLL GetPointer():hwnd:uwsc.utils.dll
PrintPointer()
Thread PrintPointer() // same above
Thread PrintPointer() // same above

procedure PrintPointer()
print GetPointer()
fend
[/uws]

So, I think UWSC use the same DLL for each thread

No.4317 2017/08/18(Fri) 13:21:24

Re: C++ DLL 関数から文字列を返す / vusd
私はいくつかの私の理解の要約:

- Non-thread safe: Using method 1 or method 2
- Thread safe:
+ We know the size of output string: allocate memory with FORMAT() + use method 4
+ We don't know the size of output string: use method 3

No.4318 2017/08/18(Fri) 13:29:01

Re: C++ DLL 関数から文字列を返す / しゅん
良いと思います。でも

If I were you, I'd do it like this.

[C++]
#include <string.h>
// Join s1 + s2 as new string
extern "C" __declspec(dllexport) int JoinString(const char* s1, const char* s2, char* result, int size) {
int n = strlen(s1) + strlen(s2) + 1;
if (result && n > 0) {
if (size >= n) {
strcpy(result, s1);
strcat(result, s2);
} else {
n = -1;
}
}
return n;
}
[/C++]
[uws]
DEF_DLL JoinString(string,string,var string,int):int:uwsc.utils.dll
dim s1="abc", s2="123", n = JoinString(s1, s2, NULL, 0)
dim s = FORMAT(CHR(0), n)
print JoinString(s1, s2, s, n)
print s
[/uws]

No.4321 2017/08/18(Fri) 17:08:39

Re: C++ DLL 関数から文字列を返す / vusd
はい、私はそれが良い方法だと思います
I think this is a good method

I just notice that many current Windows API using this method, too (ex: GetWindowTextLength() -> GetWindowText)) )

No.4323 2017/08/18(Fri) 21:56:28


 過去ログ(〜2017/03/22)・検索ツール


以下のフォームに記事No.と投稿時のパスワードを入力すれば
投稿後に記事の編集や削除が行えます。
200/200件 [ ページ : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ... 20 >> | 過去ログ ]