もともとCで計算していたものを,DLLにしました。
VBから普通に呼び出せるようにまでできるようになったのですが,
できれば,結果だけでなく計算の進捗状況・途中結果なども知りたい思うようになりした。
どのようにすれば,このような機能を実装できるのでしょうか?

ちょっとした計算に使うためにプログラムを書く程度なので,
プログラミングやOSの仕様などはよくわからないのですが,
VBで受け取れるイベントのようなものをDLLから送出したりできるのかなぁ?
なんて考えて探してみたのですが,やはりよく分かりません。
VB側では結果を待機するループのようなものは回したくないので,
イベントとして受け取れればなぁ~と思ったのですが。

説明がへたくそ&PCやプログラミングに詳しくないため
質問の真意が伝わりにくかったかもしれませんが,
どんな些細なことでも結構ですので,解決法をご教授ください。
どうぞよろしくおねがいします。

このQ&Aに関連する最新のQ&A

A 回答 (6件)

こんにちは、honiyonです。



 方法は2つあります。

 1.進捗を伝える関数を用意する。
 2.進捗報告用のコールバック関数(機能)を用意する。

 2は色々と難しいのですが、1は簡単に出来ると思います。
 進捗報告関数は、今現在の計算具合を判断し、その結果を返します。
 この関数をし、VBから一定時間ごとにその関数を呼び出す事で進捗具合を知ることが出来ます。

 簡単な説明ですが参考になれば幸いです(..
    • good
    • 0
この回答へのお礼

早速のご回答ありがとうございます。

>1.進捗を伝える関数を用意する。

ですが,これは
「VB側(上司)から一定時間ごとにDLL側(部下)に進み具合を聞きに行く」
というイメージでよろしいでしょうか?

もしできることならば
「ある程度作業が進むたびにDLL(部下)がVB(上司)に進捗を報告する」
というようなイメージにしたいのですが…。
DLLがVBにイベントを送出できたらなぁ~という発想です。

>2.進捗報告用のコールバック関数(機能)を用意する。

ですが,ご想像の通り難しくて分かりません(笑)
でも,もしかしてこれが,ぼくがやりたいと思っていることなのでしょうか?
もしそうでしたら,よろしければアドバイス頂きたいのですが。
よろしくおねがいします。

お礼日時:2001/08/23 01:56

DLLではなくActiveXとして作れば、イベントを送り出せますよ。

    • good
    • 0

今回は、VBでとのこと、がんばってください。



参考までに、下記のURL(「猫でもわかるプログラミ
ング」)のWindows SDK編72章に(DLLでやっていませ
んが)プログレスバーを出す例がありますので、
ご参考までに。

参考URL:http://www.kumei.ne.jp/c_lang/
    • good
    • 0

具体的に、やり方は説明できないのですが、UNLHA32.DLLってDLL側で、プログレスバーを表示していますよね。


あのやりかたをすれば、VB側で処理しなくてもいいのではないでしょうか。

なんのたしにもなりませんね。
ごめんなさい。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

>UNLHA32.DLLってDLL側で、プログレスバーを表示していますよね。
>あのやりかたをすれば、VB側で処理しなくてもいいのではないでしょうか。

そうだったんですか…。知りませんでした。
確かに,使う立場からしたらありがたい機能ですね。
でも,DLLでユーザインターフェースを提供するのって,
なんだか難しそうですよね(笑)
ちなみに,僕はコンソールアプリしか作ったことがないので,
計算はC,ユーザインターフェースはVBという安易な発想になってしまいました。

いずれは,「自分でプログレスバーを表示するDLL」にも挑戦してみようと思います。
どうもありがとうございました。

お礼日時:2001/08/23 12:37

こんにちは、honiyonです。



 私の紹介した2の方法を実現するには、ポインタや関数について熟知している必要があります。 また、1から全部説明すると結構な量になるのでおおまかに説明します。
 因みに、ここで紹介する方法は VBで出来るか分かりません(^^;

 コールバック関数というのは、VBでいうイベントのようなものにあたります。

 では、コールバック関数機能(?)を実装するかというと、

  1.コールバック関数のポインタを取得する。
  2.任意のタイミングで、取得したポインタを使ってコールバック関数を呼ぶ

 以上です。
 たったこれだけなのですが、実際にやろうとすると結構大変です。(ポインタ周りで)

 別件ですが、大事な事を忘れていました。
 #1の、1の方法にしろ2の方法にしろ、itohさんの仰るように非同期処理が必要になります。 これを実現するために、一般的には「マルチスレッド」というものを用います。 これもまた簡単そうでコールバック以上に難しい技術です。
 計算処理を行いつつ、平行して進捗処理も行うために必要になります。

 またかなりおおまかな回答ですが(^^;、参考になれば幸いです(..
    • good
    • 0
この回答へのお礼

再びのご回答ありがとうございます。
一度ならず,二度までも… 本当に感謝しております。

>私の紹介した2の方法を実現するには、…

「コールバック関数」というのは自分で作るのですね。
僕は計算用にコンソールアプリしか作ったことがないのですが,
WIN32-SDKとかを少しかじったときにCALLBACKというような
キーワードがあったように記憶していて,
「なにやら難しいもの」「SDKやMFCをやらなけりゃ縁のないもの」と
勝手に(笑)思い込んでおりました。

コールバックというのは,
「VB(上司)が進捗を管理する部署(コールバック関数)を設置し,
仕事を部下(DLL)に渡す際,
その部署への連絡先(コールバック関数のポインタ)を指示する」
というイメージでよろしいでしょうか?

まだ実際に試していないので定かではありませんが,
最近のバージョンではVBでも関数のポインタを渡せるようになったそうです。

では,さっそく実際につくってみようと思います。
ほんとうに,どうもありがとうございました。

お礼日時:2001/08/23 12:23

こんにちは。

itohhといいます。

>VBから普通に呼び出せるようにまでできるようになったのですが
これは、DLL内の関数を呼び出すと言うことですよね?
このDLL内の関数は、非同期で実行できるのでしょうか?
普通にと言われているところを見ると、例えば、ファイル入力関数のInput関数の
ように、入力が完了するまで関数が戻ってこないのですよね。

まず、非同期に実行できるようにDLL内の関数を作り替えなければなりません。
これは、マルチスレッドとかマルチプロセスと言われている作りにしなければ
いけないと言うことです。
その次に、計算途中でVBプログラムにメッセージを投げなければいけません。
VBプログラムでは、このメッセージを受け取ってイベントを発生させます。

このあたりの解説は、MSDNライブラリーの「非同期通知イベントの提供」を
参照してください。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

>MSDNライブラリーの「非同期通知イベントの提供」を参照してください。

「非同期」といういうキーワードがどんぴしゃりだったのですね。
系がVB-DLLではなかったですが,良いサンプルがのっていました。
どうもありがとうございました。

いずれ処理の分散化?並列化?を考えていたため,
実は既にスレッドをたてて計算しています。
プロセス間通信という言葉を聞いたことがあったので,
マルチスレッド・マルチプロセスのところをいろいろ調べていたのですが,
調べ方が足りなかったようですね。いやはや。

お礼日時:2001/08/23 11:45

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qイベントevt?evt.target:event.srcElement;の意味合い

以下の理解で合っているのでしょうか?
よくイベントの取得で

エレメント.onclick = function(evt){
var e = evt?evt.target:event.srcElement;
}
でeにイベントオブジェクトの発生元要素をセットしているのを見かけますが、
これは、ブラウザーの違いの吸収なのでしょうか?

firefoxでは、イベントハンドラー関数にイベントオブジェクトが渡されるので、渡されたイベントオブジェクトよりevt.targetで発生元要素をセットし、一方IEでは、eventという名前のオブジェクトが存在している(?)ので、イベントハンドラー関数にイベントオブジェクトが渡されず、event.srcElementで発生元要素をセットする。
 ※Opera、Safariは何でも良い

IEの場合、後から、イベントが追加されたらeventオブジェクトはどうなるのでしょうか?ある要素の一つのイベントタイプには一つのイベントハンドラーしか定義できないのでしょうか?

Aベストアンサー

> ある要素の一つのイベントタイプには一つのイベントハンドラーしか定義できないのでしょうか?
attachEvent() を使えば、複数のイベントハンドラを定義できそうです。(未検証)
また、attachEvent() の第一引数からイベントオブジェクトを取得できる、とbabu_babooさんに教わりました。
http://okwave.jp/qa5081024.html?ans_count_asc=1

ただ、attachEvent は実行順が不定という欠点があるので、現実的には「出来ない」という結論になると思います…。

addEventListenerとattachEventでは実行される順番が違う at HouseTect, JavaScripter Blog
http://hisasann.com/housetect/2008/09/addeventlistenerattachevent.html
IEのイベント実行順序は不定? - inamenaiの日記
http://d.hatena.ne.jp/inamenai/20080915/p1

IEが addEventListener() に対応してくれればいいのですが…。

> ある要素の一つのイベントタイプには一つのイベントハンドラーしか定義できないのでしょうか?
attachEvent() を使えば、複数のイベントハンドラを定義できそうです。(未検証)
また、attachEvent() の第一引数からイベントオブジェクトを取得できる、とbabu_babooさんに教わりました。
http://okwave.jp/qa5081024.html?ans_count_asc=1

ただ、attachEvent は実行順が不定という欠点があるので、現実的には「出来ない」という結論になると思います…。

addEventListenerとattachEventでは実行される順番...続きを読む

Qc言語プログラミングでアルファベットの一覧を5,10,15,20,25文字目については大文字、それ以

c言語プログラミングでアルファベットの一覧を5,10,15,20,25文字目については大文字、それ以外は小文字で表示するプログラムを作成できる方お願いします
char x;
for(x=0;x<26;x++)
[
if(x%2==0) printf(”%c”___);
else printf(”%c”,___);
]

ここまで作ったんですけど、下線部がわかりません
あと、違っている箇所があれば教えいただける方お願いします

Aベストアンサー

No.2修正
前:    if ((pt - ss + 1) % 5 == 0) {
後:    if (!((pt - ss + 1) % 5)) {

Qmousewheelイベントについて

あまりしないことだと思うのですが。
質問させていただきます。

ボタンをクリックしてmousewheelイベントを発生させることはできるでしょうか。
下記の様に書いたのですが、
event.wheelDelta = -120; //or 120
が無視されました。

function click_hoge(){
var event = document.createEventObject();
event.eventType="mousewheel";
event.wheelDelta = -120; //or 120
document.body.fireEvent( "onmousewheel", event );
}

失礼いたします。

Aベストアンサー

eventオブジェクトのwheelDeltaプロパティは、
現状のブラウザ(IE、Chrome、Firefox、Safari)では
読み出しのみで、値をセットをする事は出来ません。

http://msdn.microsoft.com/en-us/library/ms535142%28v=VS.85%29.aspx
http://help.dottoro.com/ljekedtv.php


WheelEventイベントの発火自体出来ます。
IEは、
 var evt = document.createEventObject();
 evt.detail = 0;
 elment.fireEvent ("onmousewheel",evt);
IE以外は、
 var evt = document.createEvent("WheelEvent");
 var detail = 0;
 evt.initUIEvent("mousewheel",true,true,document.defaultView,detail);
 elment.dispatchEvent(evt);
です。DOM Level 3 Eventインターフェースが実装されれば、
 var evt = document.createEvent("WheelEvent");
 evt.initWheelEvent("wheel",true,true,document.defaultView,0,0,0,0,0,0,
  document.body,null,0,-120,0,0);
 elm.dispatchEvent(evt);
とできそうですが....

現状の対処として、イベント自体は発火してますから、
detailプロパティにホイール量を仮セットしておいて、
onmousewheelのイベントハンドラー関数で、
event.wheelDeltaを参照する代わりに、event.detailを参照して
スクロールなり何なりの処理を自分で書いてあげれば、
思ったことが出来るかも。

http://www.w3.org/TR/DOM-Level-3-Events/#events-wheelevents
http://help.dottoro.com/ljrxdxdw.php
http://msdn.microsoft.com/en-us/library/ms536390%28VS.85%29.aspx

eventオブジェクトのwheelDeltaプロパティは、
現状のブラウザ(IE、Chrome、Firefox、Safari)では
読み出しのみで、値をセットをする事は出来ません。

http://msdn.microsoft.com/en-us/library/ms535142%28v=VS.85%29.aspx
http://help.dottoro.com/ljekedtv.php


WheelEventイベントの発火自体出来ます。
IEは、
 var evt = document.createEventObject();
 evt.detail = 0;
 elment.fireEvent ("onmousewheel",evt);
IE以外は、
 var evt = document.createEvent("WheelEvent");
 var detail = 0;
 e...続きを読む

QC言語(gcc), Linux, FTPプログラミング

C言語でFTPを使用してあるサーバからデータをダウンロードするプログラムを作りたいのですが、短期間で作らなければならない為、なるべく作り込みはしたくないのです。
FTPを扱うライブラリのようなものがあるのが一番ありがたいのですが、ご存じないでしょうか?
条件としては
・gccのバージョン3~4ぐらいで使えること。
・Solaris,RedHatなど主要なLinuxで使えること。
・ライセンスの制限がなるべく無いこと。
以上、よろしくお願いいたします。

Aベストアンサー

> FTPでアップロードは出来るという記述はあったのですが

私は逆にget出来る、の記述しか見つけられませんでした。
http://www.libcurl.org/ より:
> libcurl is a free, open source client to get documents/files from servers, using any of the supported protocols.

対応プロトコルの数を考えるとちとftp専用としてはサイズが大きそうな気はしますが、簡単に使えそうではありますね。

QDLL内のイベントをハンドリング

VB2008にて、外部DLL(VB2008作成)を使用しようと考えています。

外部DLLの仕様書には、メソッド、イベント、プロパティが記載されており、
外部DLLの発生させるイベントをハンドリングしたいのですがうまくいきません。

「参照の追加」にてDLLを指定し、ソース内で該当DLLのクラスもインスタンス化し、
DLL内のメソッドは使用できています。

イベントに関して仕様書には
Event001(Byval arg1,Byval arg2)、Event002(Byval arg1,Byval arg2)、Event003…
このように記載されています。


該当DLLのインスタンス化したものをTestClassとして、
Public Event TestEvent Handles TestClass.Event001
という記載では駄目でした。

外部DLLのイベントのハンドリングについて、ご教授頂けましたら幸いです。

Aベストアンサー

まず、

Private WithEvents TestClass As Class1

などのように宣言します。(クラスを Class1 としました。また、必要であれば、Protected や Public にしても構いません。)
すると、コードのウィンドウの上にある二つ並んだコンボボックスの左側で TestClass が選択できるようになります。TestClass を選択して、次に、右側のコンボボックスから Event001 を選択すると

Private Sub TestClass_Event001(ByVal arg1 As Object, ByVal arg2 As Object) Handles TestClass.Event001

End Sub

が自動的に生成されると思います。
(手入力も可)

Q1,1,2,3,5,8,13の合計

初心者ですみませんが、1,1,2,3,5,8,13の合計を出すプログラミングがどうしてもわかりません。どなたかご教示頂けましたら助かります。
宜しくお願いいたします。

Aベストアンサー

#include <stdio.h>

int main(void)
{
   printf("%d\n", 1+1+2+3+5+8+13);
}

Qイベント日付(複数または連続した日付)をデータベースで管理する方法について

イベント情報のデータベースを作成していますが、
どのように日付情報をデータベースとして持たせたらよいのか悩んでいます。
効率的な方法がありましたら教えていただけると幸いです。
長文になり、失礼いたします。

[目的]
イベント毎に開催日時や主催者などのデータベースを構築し、開催日時で検索を行いたい。

[悩みどころ]
開催日時が、”2008年9月24日”のように1日で終わるものであれば問題ないのですが、”2008年9月24~28日”のような連続した日付や、”2008年9月24日、2008年9月26日”のような連続しない複数日の場合に、どのようなデータベース構造を持たせるべきなのか悩んでいます。

[現状の案]
現状は、イベントテーブルと日付テーブルを分けて管理する方法を考えていますが、これが一般的な方法なのでしょうか。

<EVENT_TABLE>
event_id:(auto increment)
event_name:イベントの名前

<DATE_TABLE>
date_id:(auto increment)
event_id:EVENT_TABLE.event_id を指すID
date:イベント開催日単日

イベントの開催日が1日であれば、一つのevent_idと一つのdate_id。
イベントの開催日が、連続した三日であれば、一つのevent_idと三つのdate_id。
イベントの開催日が、連続しない三日であれば、一つのevent_idと三つのdate_id。

イベント情報のデータベースを作成していますが、
どのように日付情報をデータベースとして持たせたらよいのか悩んでいます。
効率的な方法がありましたら教えていただけると幸いです。
長文になり、失礼いたします。

[目的]
イベント毎に開催日時や主催者などのデータベースを構築し、開催日時で検索を行いたい。

[悩みどころ]
開催日時が、”2008年9月24日”のように1日で終わるものであれば問題ないのですが、”2008年9月24~28日”のような連続した日付や、”2008年9月24日、2008年9月26日”のような連続...続きを読む

Aベストアンサー

一般的かどうかはわかりませんが、
複数のテーブルをJOINするのが好みかどうかとか、
データベースの効率を考えるとどうかと言うので決まってくるのでしょう。

私はあまりJOINしたくないと言う気持ちだけの話でANo.1のご回答にあるような感じでしてしまいます。
これに、連続しない開催の場合は、初日のイベントIDを他の開催日のデータに持たせて関連づけておけば、重なるデータ(イベント名など、他詳細情報もこちらに記録されるのだと思っています)は初日の方にだけ記録しておいても、なんとかなるのかなと思います。
と言うのが、私の今までの経験から思いつく事でした。

ANo.2で質問者様の方法で十分との事でしたので、よくよく考えてみると、なるほどその方が拡張性があるのかなと思ったりもしています。
データベース効率はどちらがいいのかわかりませんが、今お考えになられている方法から遠のくと難しくなるかも知れませんので、別の問題が起こらない間はそのまま進めてみられた方がいいのかと思います。

「DATE_TABLE」は、連続していようとしていまいと関係なく、開催している日分のデータがあると言う事と考えてよろしいでしょうか。
日時で検索するのでしたら、「DATE_TABLE」には、その日の開始時刻と終了時刻を記録しておくようになるのかも知れません。
最終日だけ早めに終わったりするようなイベントもあるのでしたら、「EVENT_TABLE」側で時刻を持つよりもいいのかなと思います。

一般的かどうかはわかりませんが、
複数のテーブルをJOINするのが好みかどうかとか、
データベースの効率を考えるとどうかと言うので決まってくるのでしょう。

私はあまりJOINしたくないと言う気持ちだけの話でANo.1のご回答にあるような感じでしてしまいます。
これに、連続しない開催の場合は、初日のイベントIDを他の開催日のデータに持たせて関連づけておけば、重なるデータ(イベント名など、他詳細情報もこちらに記録されるのだと思っています)は初日の方にだけ記録しておいても、なんとか...続きを読む

Qmemcpy,memcmp,strcmp,strlen,strcat,

memcpy,memcmp,strcmp,strlen,strcat,strcpy,strstr,strchr
以上の関数を自作しました。
ひとつひとつを見たときに動作を確認したところうまく出来たのですが、この関数をプログラムに組み込んだところうまく動作しませんでした。
どこか間違っているところがあったら指摘して頂きたいと思います<m(__)m>
ちなみに標準関数と全く同じものにしたいわけではなく、それを自分なりに考えて作りたいという趣旨ですので、ご理解ください。


char *MyMemcpy(char *str1, char *str2, size_t n)
{

char *p1 = str1;
char *p2 = str2;


while(n--){
*p1 = *p2;
p1++;
p2++;
}

return str1;
}
void *MyMemcmp(void *str1, void *str2)
{
char *p1 = (char*)str1;
char *p2 = (char*)str2;
int n = 0, k = 0;

while( *p1 != '\0'){
*p1++;
n++;
}

while( *p2 != '\0'){
*p2++;
k++;
}

if(n > k){
return str1;
}else if(n == k){
return 0;
}else if(n < k){
return str2;
}

}
char *MyStrcmp(char *str1, char *str2)
{
char *p1 = str1;
char *p2 = str2;
int n = 0, k = 0;

while( *p1 != '\0'){
*p1++;
n++;
}

while( *p2 != '\0'){
*p2++;
k++;
}

if(n > k){
return str1;
}else if(n == k){
return 0;
}else if(n < k){
return str2;
}

}
size_t MyStrlen(const char *str1)
{
char *p1 = (char*)str1;
size_t len = 0;

while(*p1 != NULL){
*p1++;
len++;
}

return len;
}
char *MyStrcat(char *str1, const char *str2)
{
char *p1 = str1;
char *p2 = (char*)str2;

while(*p1 != NULL){
*p1++;
}
while(*p2 != NULL){
*p1 = *p2;
*p1++;
*p2++;
}

return str1;
}
char *MyStrcpy(char *str1, char *str2)
{
char *p1 = str1;
char *p2 = str2;

while( *p2 != NULL){
*p1 = *p2;
*p1++;
*p2++;
}
*p1 = '\0';

return str1;
}
char *MyStrstr(char *str1, char *str2)
{
char *p1 = str1;
char *p2 = str2;

while(*p1 != *p2)
{
if(*p1 == '\0'){
return 0;
}
*p1++;
}
return p1;

}
char *MyStrchr(const char *str1, char str2)
{
char *p1 = (char*)str1;

while(*p1 != str2)
{
if(*p1 == '\0'){
return 0;
}
*p1++;
}
return p1;
}

memcpy,memcmp,strcmp,strlen,strcat,strcpy,strstr,strchr
以上の関数を自作しました。
ひとつひとつを見たときに動作を確認したところうまく出来たのですが、この関数をプログラムに組み込んだところうまく動作しませんでした。
どこか間違っているところがあったら指摘して頂きたいと思います<m(__)m>
ちなみに標準関数と全く同じものにしたいわけではなく、それを自分なりに考えて作りたいという趣旨ですので、ご理解ください。


char *MyMemcpy(char *str1, char *str2, size_t n)
{

char *p1 = str1;
char...続きを読む

Aベストアンサー

> この関数をプログラムに組み込んだところうまく動作しませんでした。

どんな風に「うまく動作し」なかったのでしょうか?
それがわからなければ、明らかな間違いでも無いかぎり、答えようがありません。

特に
> ちなみに標準関数と全く同じものにしたいわけではなく、それを自分なりに考えて作りたいという趣旨ですので、ご理解ください。
とあるので、このプログラムと標準関数との違いが、間違いなのか仕様通りなのか判断できません。

例えば、
> char *MyStrcmp(char *str1, char *str2)
プログラムを解読すると

str1とstr2、それぞれの文字列の長さを比較。
→長さ等しい場合は (char *)NULL, 異なる場合は、長い方の文字列へのポインタを返す

と、strcmpとはまったく別の関数になっています。(strcmpは文字列の内容も比較し、結果を 負の整数,0,正の整数 (いずれもint型)で返します)


あと、明確な間違いというわけではないですが。
> while(*p1 != NULL){

大抵の処理系では NULL == '\0' == 0 として使えるけど、ヌルポインタとヌル文字はわけて考えた方がいいです。

> この関数をプログラムに組み込んだところうまく動作しませんでした。

どんな風に「うまく動作し」なかったのでしょうか?
それがわからなければ、明らかな間違いでも無いかぎり、答えようがありません。

特に
> ちなみに標準関数と全く同じものにしたいわけではなく、それを自分なりに考えて作りたいという趣旨ですので、ご理解ください。
とあるので、このプログラムと標準関数との違いが、間違いなのか仕様通りなのか判断できません。

例えば、
> char *MyStrcmp(char *str1, char *str2)
プログラムを解読...続きを読む

QActionscript3.0 子のイベントを削除

Actionscript3.0で親のムービーから子のイベント指定して削除することは可能でしょうか?

親のステージに配置したmymcの中でballをENTER_FRAMEを使い動かしています。
親のステージに配置したbtnをクリックすることで、
ENTER_FRAMEを削除したいのですが、
下記のスクリプトだと、親のほうでmyenterframeが未定義と表示されてしまいます。

どのように記述すればよいのでしょうか?
よろしくお願いいたします。


ーーーーーーーーーーーーーーーーー親ーーーーーーーーーーーーーーーーー
btn.addEventListener (MouseEvent.CLICK, myclick);
function myclick(event:MouseEvent):void{
mymc.removeEventListener(Event.ENTER_FRAME, myenterframe);
}

ーーーーーーーーーーーーーーーーーmymcーーーーーーーーーーーーーーーーー
addEventListener(Event.ENTER_FRAME, myenterframe);
function myenterframe(evt:Event):void {
ball.x++;
}

Actionscript3.0で親のムービーから子のイベント指定して削除することは可能でしょうか?

親のステージに配置したmymcの中でballをENTER_FRAMEを使い動かしています。
親のステージに配置したbtnをクリックすることで、
ENTER_FRAMEを削除したいのですが、
下記のスクリプトだと、親のほうでmyenterframeが未定義と表示されてしまいます。

どのように記述すればよいのでしょうか?
よろしくお願いいたします。


ーーーーーーーーーーーーーーーーー親ーーーーーーーーーーーーーーーーー
btn.addEventListener ...続きを読む

Aベストアンサー

myenterframeはmymcの名前空間にいるので

mymc.removeEventListener(Event.ENTER_FRAME, mymc.myenterframe);

とやれば動くんじゃないですかね


ちなみに僕はこういうことするときはmymc側に
リスナーを全てremoveする為の
destroyメソッドとか用意するようにしてます

そういうふうにしておけばmymcにremoveしたいリスナーが増えたり
親のclick以外からもmymcのリスナーをremoveしたいとなったときも
書き換えが楽になるのでオススメ

QDLL VBとC++

VBAからVC++2005のDLLを呼び出すプログラムを書いています。

VB側で作成したcpp_proc関数を呼ぶとVBアプリ自体が落ちました。

DLLのreturnの直前に以下のMessageBoxで表示させるとそこまでは表示され、
リターンを押すと、落ちました。

VB側の引数の値 String * 8192が悪いのでしょうか?
return直前まで動作していたので、DLLの戻り値に何か原因があるのでしょうか?


ついでの質問ですが、DEFの @1は無くても動くのでしょうか?
意味が知りたいです。


// ----- C++ (DLL側) -----

int __stdcall cpp_proc(LPCSTR inp, LPSTR out)
{

... 省略

MessageBox(0, "ここまで通過", "debug", MB_OK);

return 0;

}


// ----- DEF -----

LIBRARY "example"
DESCRIPTION 'テスト'

EXPORTS
; 明示的なエクスポートはここへ記述できます
cpp_proc @1


'----- VB側 -----

Public Declare Function cpp_proc Lib "example.dll" _
(ByVal inp As String, ByRef out As String) As Integer

Public Sub Test()
Dim ret As Integer
Dim inp As String
Dim out As String * 8192

ret = cpp_proc(inp, out)

MsgBox("ret=[" & Cstr(ret) & "]");

End Sub

VBAからVC++2005のDLLを呼び出すプログラムを書いています。

VB側で作成したcpp_proc関数を呼ぶとVBアプリ自体が落ちました。

DLLのreturnの直前に以下のMessageBoxで表示させるとそこまでは表示され、
リターンを押すと、落ちました。

VB側の引数の値 String * 8192が悪いのでしょうか?
return直前まで動作していたので、DLLの戻り値に何か原因があるのでしょうか?


ついでの質問ですが、DEFの @1は無くても動くのでしょうか?
意味が知りたいです。


// ----- C++ (DLL側) -----

int ...続きを読む

Aベストアンサー

 こんにちは。補足頂きました。確かに可笑しいです。
 SysAllocStringByteLen()を使用してVBに送り返すそうです。此れでは駄目でしょうか。

//
//VC側
//
#include"exsample.h"
#include<string.h>
#include<comutil.h>
#pragma comment(lib, "comsupp.lib")
#pragma comment(lib, "comsuppw.lib")

int __stdcall cpp_proc(LPSTR inp, BSTR* out)
{
CHAR buf[1024];
strcpy(buf, inp);
MessageBoxA(0, buf, "化け文字??", MB_OK); // 文字化け? わかりません?

// ついでに、outに "結果はゼロです" という日本語文字を返したいです。
// どう書けばよいか、わかりません。
SysFreeString(*out);
LPCSTR psz = "結果はゼロです";
*out = SysAllocStringByteLen(psz, ::strlen(psz));

// 戻り値
return 2;
}

//
//VB側
//
Public Declare Function cpp_proc Lib "tovba.dll" (ByVal inp As String, ByRef out As String) As Integer


Public Sub Test()

Dim ret As Integer
Dim inp As String
Dim out As String

inp = "abcdefg"
'out = Space(1024) 必要なし

ret = cpp_proc(inp, out)

MsgBox ("ret=[" & CStr(ret) & "]") '2が返ります。
MsgBox ("inp=[" & inp & "]") '送った内容 abcdefg
MsgBox ("out=[" & out & "]") '「結果はゼロです」という文字を表示させたい。
MsgBox ("outLength=[" & CStr(Len(out)) & "]") '文字数の計測

End Sub

 こんにちは。補足頂きました。確かに可笑しいです。
 SysAllocStringByteLen()を使用してVBに送り返すそうです。此れでは駄目でしょうか。

//
//VC側
//
#include"exsample.h"
#include<string.h>
#include<comutil.h>
#pragma comment(lib, "comsupp.lib")
#pragma comment(lib, "comsuppw.lib")

int __stdcall cpp_proc(LPSTR inp, BSTR* out)
{
CHAR buf[1024];
strcpy(buf, inp);
MessageBoxA(0, buf, "化け文字??", MB_OK); // 文字化け? わかりません?

// ついでに、outに "結...続きを読む


人気Q&Aランキング

おすすめ情報