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

起動しなくなります / 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
WEBページ上でのカーソル位置を問わず,Home,End,PageUp,PageDownキーをWindowのスクロールに割り当てたい / ASH_LYNX
例えば,Yahoo!トップページ上の「検索窓」に「UWSC」と入力し,カーソルがそのまま検索窓内にある場合,Home,Endキーを押すと,UWSC文字列の前と後ろに移動し,PageUp,PageDownキーはページがスクロールするわけでもなく,そのままです。

これを「テキストボックスにカーソルが存在」していても常にHomeキーではページ最上部に,Endキーでは最下部に,PageUp,PageDownキーではそれぞれ上下スクロールという風には出来ないでしょうか?

カーソルがテキストボックス内にあったとしても,とにかくHome,End,PageUp,PageDownキーでブラウザのページを上下スクロールさせたいということなのですが。

No.4303 2017/08/12(Sat) 01:12:48

Re: WEBページ上でのカーソル位置を問わず,Home,End,PageUp,PageDownキーをWindowのスクロールに割り当てたい / stuncloud
getslider()でSLD_MAXやSLD_PAGEを取得してsetslider()で移動させる、ということになると思います
ただ、何のブラウザを使っているかでできたりできなかったりしそうな気がしますが
(Chrome系だったら幾つか前のスレにあったアドレスバーにjs投げる方法が良いかもしれない、とか)

僕がやるとしたら以下の様にします
Pauseを押すまで待機し続け、Home,End,PageUp,PageDownが押されたときはそれぞれの処理を行います
ブラウザ以外のウィンドウがアクティブだった場合は動作しません
肝心のスクロール処理に関しては対象が定まらないと書きようがないので省略しています

// 以下スクリプト

const BROWSER_CLASS = "対象のスクロールバーが表示されるウィンドウのクラス"

sethotkey(VK_HOME, 0, "Scroll")
sethotkey(VK_END, 0, "Scroll")
sethotkey(VK_PRIOR, 0, "Scroll")
sethotkey(VK_NEXT, 0, "Scroll")
sethotkey(VK_PAUSE, 0, "ForceExit")

while TRUE
 sleep(0.1)
wend

procedure Scroll()
 active = getid(GET_ACTIVE_WIN)
 if pos(BROWSER_CLASS, status(active, ST_CLASS)) > 0 then
  select HOTKEY_VK
   case VK_HOME
    Home(active)
   case VK_END
    End(active)
   case VK_PRIOR // Page Up
    PageUp(active)
   case VK_NEXT // Page Down
    PageDown(active)
  selend
 else
  // アクティブウィンドウが対象ブラウザじゃない場合は入力キーをパススルー
  sckey(active, HOTKEY_VK)
 endif
fend

procedure ForceExit()
 exitexit
fend

procedure Home(id)
 // Homeを押した時のスクロール処理
fend

procedure End(id)
 // Endを押した時のスクロール処理
fend

procedure PageUp(id)
 // Page Upを押した時のスクロール処理
fend

procedure PageDown(id)
 // Page Downを押した時のスクロール処理
fend

No.4308 2017/08/16(Wed) 12:24:52
accessのマクロの実行 / bee
すでに起動しているaccessのファイル d:\test\db.mdbのテストマクロという名前のマクロをuwscで実行したいのですが、どのようにすればよいのでしょうか。
No.4305 2017/08/14(Mon) 12:16:15

Re: accessのマクロの実行 / yanyan
VBAをくぐるといろいろなCOM関係の情報が得られるので、UWSC用に変換する

AccessObj = GetActiveOleObj("Access.Application")
AccessObj.DoCmd.RunMacro("テストマクロ")

No.4306 2017/08/14(Mon) 16:31:16

Re: accessのマクロの実行 / bee
教えていただいた方法で、無事にマクロを実行できました。
ありがとうございました。

No.4307 2017/08/15(Tue) 11:50:28
重複しないデータをカウント / 初心者
{"id":111},{"id":222},{"id":333},{"id":111},

この文字列の中から重複しないデータのカウントをして3という結果を出す場合はどうすれば良いでしょうか。

No.4299 2017/08/09(Wed) 19:42:19

Re: 重複しないデータをカウント / satocha
<前提>
>重複しないデータのカウントをして3という結果を出す
ことはできません。なぜなら、重複しないデータの数は4通りあるからです。並び順を変えて
{"id":111},,{"id":222},{"id":333},{"id":111}
とすると問題がはっきりすると思います。
コンマで終わっている(ように見える)ので気づきにくいですが、データが空文字である最後尾の状態も他の状態と区別される一つの状態だからです。

<重複削除>
データの重複を避ける常套的な手段として、連想配列の利用があります。コードで書くとこんな感じ。

hashtbl data_hash
for data in split( DATA_STRING, "," )
 data_hash[ data ]="dummy"
next
msgbox( "重複しないデータの個数は"+length(data_hash) )
textblock DATA_STRING
{"id":111},{"id":222},{"id":333},{"id":111},
endTextBlock

先に述べたようにデータの個数は4となります。これが、どう動くのかを理解しようとすると、結構な頭の体操になります。詳しい説明が本掲示板1489以下のスレッドにあるので見ておいてください。
http://www3.rocketbbs.com/13/bbs.cgi?id=umiumi&mode=pickup&no=1489

<uniq>
dos/windowsにはありませんが、UNIX系システムには古くから(何十年も前から)重複行を削除する「uniq」というコマンドが実装されています。このコマンドは直前の行と現在の行を比較し、同じなら出力しないというだけなので、使うときはソートコマンドとのセットになります。
ファイル出力|sort|uniq|wc -l

Windows10では去年夏のアップデート以降、Linuxディストリビューションの一つUbuntuがオプションで使えるようになっているので、これを試すこともできます。

UNIX系uniqは使える環境が限られますが、UNIX系シェルを超えることを目標の一つに開発されたpowershellも「get-unique」というコマドレットを持っています。powershellはXP以降のWindowsすべてで使えます。UWSCから利用する方法は下を見てください。

msgbox("重複しないデータの個数は"+powershell(src))
textblock src
$dataArray=@"
{"id":111},{"id":222},{"id":333},{"id":111},
"@ -split ","
($dataArray|sort-object|get-unique).length
endtextblock

No.4300 2017/08/10(Thu) 04:17:46

Re: 重複しないデータをカウント / satocha
追加です。

<uniqを自分でやってみる>

前項を書いてみて、 @ソートし、A直前と比較する なら何も出来合いの機能じゃなくても簡単に書けることに気づきました。

array=split("{<#dbl>id<#dbl>:111},{<#dbl>id<#dbl>:222},{<#dbl>id<#dbl>:333},{<#dbl>id<#dbl>:111},",",")
qsort(array)
count=0
before=null+null+null
for data in array
 if data <> before then count=count+1
 before=data
next
msgbox("重複しないデータの個数は"+count)

ここでキモとなるのはおそらくどんな文字列にも(空文字にも)等しくならないであろう文字列を最初に変数beforeに与えておくこと。自力で発見したのではなく、stuncloudさんのブログからパクった←←←←インスパイアされたのは内緒です。

No.4301 2017/08/10(Thu) 05:31:50

Re: 重複しないデータをカウント / しろまさ
// 連想配列版
HashTbl hDat
ary=split("{<#dbl>id<#dbl>:111},{<#dbl>id<#dbl>:222},{<#dbl>id<#dbl>:333},{<#dbl>id<#dbl>:111},",",",TRUE) // arg3:TURE で空文字削除
for d in ary
 hDat[d] = d
next
msgbox("重複しないデータの個数は"+Length(hDat))

No.4302 2017/08/10(Thu) 10:39:03
MOUSEORG関数のMORG_DIRECT指定時 / name
ver5.2.3ではMOUSEORG関数のMORG_DIRECT指定時 Ctrlが反応するんですが、Ver5.3.0.2では反応してくれません。
同じスクリプトファイルを使っています。

No.4278 2017/07/28(Fri) 12:20:26

Re: MOUSEORG関数のMORG_DIRECT指定時 / name
windows10です
No.4279 2017/07/28(Fri) 12:21:44

Re: MOUSEORG関数のMORG_DIRECT指定時 / name
コマンドプロンプト使用時です
No.4297 2017/08/06(Sun) 11:07:31

Re: MOUSEORG関数のMORG_DIRECT指定時 / umiumi
確認しました。
対処します。

No.4298 2017/08/08(Tue) 18:04:36
ずっとbusy状態になります。 / たく
UWSCバージョン:5.3(フリー版)
OS:Windows 7 Pro
IEバージョン:11.0.9600.18738
IE更新バージョン:11.0.44(KB4025252)

上記環境の2台の仮想PCでUWSCを起動させているのですが、2台のうち1台がこちらのページのGOボタンを押すと、ずっとbusy状態となり、いつまで経ってもループを抜けません。
readystateは4になります。
http://www.geocities.jp/geogeo5533/index.html
(このページは質問のために作成したテストページとなります)

[2台のPCで動作させているソースコード]
IE = getactiveoleobj("InternetExplorer.Application")

while IE.busy or IE.readystate<>4
   print IE.busy+" "+IE.readystate
   sleep(1)
wend

何度か試しているうちに下記のコードだとループを抜けることができました。readystateは4になります。
[改善したソースコード]
IE = getactiveoleobj("InternetExplorer.Application")

while IE.busy or IE.readystate<>4
   IE = getactiveoleobj("InternetExplorer.Application")
   print IE.busy+" "+IE.readystate
   sleep(1)
wend

後者のコードで動作するので、busy状態がループの中で返ってきていない様に感じます。
なぜこのような動作の違いが発生するのでしょうか?

2台のPCともに、UWSCのバージョン、OSやIEバージョンなどは同じですが、その他の構成には若干違いがあります。

しかし、全ての差異を確認するのは大変ですので、何か必要な情報などございましたらお教えください。

どうぞよろしくお願い致します。

No.4290 2017/08/04(Fri) 04:42:58

Re: ずっとbusy状態になります。 / satocha
外しているかもしれませんが、だめなほうは、インターネットオプションの「保護モードを有効にする」が外れてたりしませんか。
No.4291 2017/08/04(Fri) 16:09:41

Re: ずっとbusy状態になります。 / たく
ご返信ありがとうございます。

確認しましたところ、2台のPC共に有効にチェックが入っていました。

こちらからの質問で恐縮ですが、satocha様はこちらのページのGOボタンを押してもbusy状態のままとなりませんでしょうか?
http://www.geocities.jp/geogeo5533/index.html

No.4293 2017/08/05(Sat) 09:32:16

Re: ずっとbusy状態になります。 / satocha
そのスクリプトだと速すぎてGOボタンを押せなかったので、スクリプトの中でボタンを押してみましたが、正常動作でした。
環境はWin10 Creators Update適用

IE = getActiveOleObj("InternetExplorer.Application")
IE.navigate2("http://www.geocities.jp/geogeo5533/index.html")
while IE.busy or IE.readystate<>4
wend
getOleItem(IE.document.getElementsByTagName("input"))
submit=all_ole_item[0]
//ボタンがちゃんと取れてるか確認
msgbox(submit.outerHTML)
//Goボタンクリック
submit.click()
while IE.busy or IE.readystate<>4
   print IE.busy+" "+IE.readystate
   sleep(1)
wend
   print "exited"
   print IE.busy+" "+IE.readystate
   sleep(1)

いずれにせよ、IEオブジェクトの再取得で問題が解決されるなら、一定時間得ループを回したあと、時間切れならオブジェクトを再取得するような手順をスクリプトに追加すればいいのでは?
検証してないけれど、こんな感じ。
wait=0.5   //0.5秒待つ
limit=gettime()
limit=limit+g_time_zz+wait

while IE.busy or IE.readystate<>4
   now=gettime()
   now=now+g_time_zz
   if now > limit
   IE = getactiveoleobj("InternetExplorer.Application")
   endif
   print IE.busy+" "+IE.readystate
   sleep(1)
wend

No.4294 2017/08/05(Sat) 11:05:28

Re: ずっとbusy状態になります。 / たく
検証、改善策のコードのご提供頂きありがとうございます。

個人的に、IEオブジェクトの操作で、なぜPC間によって動作が異なるのか疑問に思いました。

UWSCのバグなのか、または何か必要な更新プログラムをインストールしていないのか、原因が判明すればと思い投稿いたしました。

もし原因がわかる方がいらっしゃいましたら、ご教示頂けると幸いです。

No.4295 2017/08/05(Sat) 19:07:22

Re: ずっとbusy状態になります。 / satocha
こちらで再現できないので、断定できないのですが、たく様の環境でも
    IE = getactiveoleobj("InternetExplorer.Application")
の1業を追加すること(=IEオブジェクト再取得)で動いた、ということですよね。。

もしそうなら、仮にUWSCに何か問題があるとすれば、IEオートメーションが切断されているにもかかわらず、IE.busy だの IE.readystate だのの参照がエラーにせず、前の値を返していることでしかありません。

この問題(あえて不具合とは言いません)に対処しなければならないとすれば、UWSC製作者は、COMオブジェクト配下のプロパティ参照やメソッド実行に際していちいち、オートメーションの接続を確認するコードを付加しなければならなくなり、その結果は程度は分かりませんが、UWSCのパフォーマンスを低下させることになるでしょう。

UWSCの挙動を問題にするのではなく、純粋に知的好奇心から、環境の違いによってIEオートメーションの動きに違いがある原因を知りたいというのでしたら、この掲示板はUWSCに特化した掲示板ですので、質問先としてはふさわしくないと思います。MSのテックネットのIEフォーラムなどで質問されるのがいいと思います。

ただ、現状、たく様がお示しの情報では、2つの環境の差は誰にも分からない状況ですので、最低でも、レジストリのIEまわり、インターネットオプション周りのデータをエクスポートして質問されることをおすすめします。

No.4296 2017/08/05(Sat) 20:06:05
SAVEIMGによるキャプチャについて / IKE
UWSCを利用して、IEで表示させたWebページのキャプチャを取得したいと考えています。
BMPファイルは容量が大きいのでJPG形式にし、なおかつ不要な部分が映らないよう、次のようにしました。

IE = GETACTIVEOLEOBJ("InternetExplorer.Application")
ID = GETID("UWSC - Internet Explorer") //キャプチャ対象のタイトルに適宜変更する
SAVEIMG("test.jpg",ID,,,,,1,100)

しかし、こうして取得したキャプチャが、Webページによっては、一部の表示が消えていたり、真っ黒な画像となってしまいます。これは何が原因なのでしょうか。

また、UWSCを利用して、全画面キャプチャではなく、Webページ全体である「スクロールキャプチャ」を取得したいのですが、何か良い方法はないでしょうか。

OS:Windows 7(32bit)
ブラウザ:IE11になります。

どうぞよろしくお願いいたします。

No.4286 2017/08/03(Thu) 09:07:16

Re: SAVEIMGによるキャプチャについて / stuncloud
> また、UWSCを利用して、全画面キャプチャではなく、Webページ全体である「スクロールキャプチャ」を取得したいのですが、何か良い方法はないでしょうか。

html2canvasというのを使ってみました
https://html2canvas.hertzen.com/

以下のスクリプトはキャプチャしたいページをIEで開いており、IEオブジェクトが変数ieに格納されていることを想定しています
キャプチャした画像はIEからダウンロードして保存するようになっています(ダウンロードは待ってると始まります)

※UWSCからブラウザ上のjsを実行するトリックは
http://language-and-engineering.hatenablog.jp/entry/20090825/p1
を参考にしました、textblock proxyの部分ですね
eval叩いてるのでちょっとこわい

※ちなみに僕自身もhtml2canvasの使い方がわかってるわけではないので、使い込みたいという場合は色々調べてみてください
その場合はtextblock captureの部分を変更します(JavaScriptのコードです)

※html2canvasの注意点にもありますが、flashだとかiframe内の他所のコンテンツだとかはキャプチャできないです

//////////////////////////////////////////////////
html2canvas_path = "C:\path\to\html2canvas.js" // html2canvas.jsのパスを指定

script = ie.document.createElement("script")
script.type = "text/javascript"
script.text = proxy
ie.document.getElementsByTagName("head").item(0).appendChild(script)

fid = fopen(html2canvas_path, F_READ)
html2canvas_script = fget(fid, F_ALLTEXT)
fclose(fid)
script = ie.document.createElement("script")
script.type = "text/javascript"
script.text = html2canvas_script
ie.document.getElementsByTagName("head").item(0).appendChild(script)

ie.document._uwsc_proxy.eval_code(capture)
msgbox("キャプチャを取得中です、ダウンロードが開始されるまでしばらくお待ち下さい")


textblock proxy
document._uwsc_proxy = {
global : this,
_window : window,
eval_code : function( str ){
try{
return eval( str );
}catch(e){
return null;
}
}
};
endtextblock

textblock capture
html2canvas(document.body,{
onrendered: function(canvas){
var blob = canvas.msToBlob();
window.navigator.msSaveBlob(blob, 'capture.png');
}
});
endtextblock

No.4289 2017/08/03(Thu) 11:40:38

Re: SAVEIMGによるキャプチャについて / IKE
stuncloudさん
サンプルプログラムの方は動作させることができました。
私はjavascriptについては詳しくないので、応用は難しいかもしれませんが、参考にさせていただきます。
ありがとうございました。

No.4292 2017/08/04(Fri) 22:56:41
FOPENでメモファイルを64回以上開きたい / skyblue
 いつも大変お世話になっています。

 FOPEN関数を使って、メモ帳(1行の記録データを変化させている)を繰り返し開きますが、開く回数が64回を超えるとエラーとなり中止になります。

 何か良い方法が有ればご指導ください。

a=FOPEN(パス,F_READ or F_WRITE)
b=FGET(a, 1)

No.4284 2017/08/02(Wed) 18:51:50

Re: FOPENでメモファイルを64回以上開きたい / satocha
fopenしたあときちんとfcloseしてますか。
開きっぱなしで扱える数には上限が有りますので。

No.4285 2017/08/03(Thu) 01:11:26

Re: FOPENでメモファイルを64回以上開きたい / skyblue
satocha さん 有難う御座います。

 早々とご指導頂き感謝しています。

 nothing とか close 等が有るかと、ネットで fopen の例題を見負た時には見つける事が出来ませんでした。
また、デスクトップ上には目的のファイルが1枚も開いていなかったので、気になりませんでした。

 早速、実際のソフトで試して、後程報告します。

No.4287 2017/08/03(Thu) 09:34:33

Re: FOPENでメモファイルを64回以上開きたい / skyblue
satocha さん 

 お陰様で解決しました。
実際に走らせて問題無く64回を超えました。
ご指導、有難う御座いました。

No.4288 2017/08/03(Thu) 11:06:39


 過去ログ(〜2017/08/24)・検索ツール


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