パブリックオブジェクトモジュールで定義されたユーザー定義型に限り、変数に割り当てることができ、実行時バインディングの関数を渡すことができます

解決


MB初心者  2004-07-15 23:14:07  No: 114822

『パブリックオブジェクトモジュールで定義されたユーザー定義型に限り、変数に割り当てることができ、実行時バインディングの関数を渡すことができます』が解決出来ない

----------
標準モジュール
Public Type pMode
    nSize   As Integer
    nOption As Integer
End Type
Public OPEN_MODE    As pMode
'ハンドル取得
Public Declare Function XDW_OpenDocumentHandle Lib "XDWAPI.DLL" (ByVal FPath, ByVal pHandle, ByVal sMODE As pMode) As Long
----------------
フォームモジュール
Private Sub AddAnnotationTest_Click()
'ハンドル取得
Dim OpenHandle  As Long
Dim Handle      As Long
Dim xom As pMode
xom.nOption = XDW_OPEN_UPDATE
OpenHandle = XDW_OpenDocumentHandle(FilePath.Text, Handle, CVar(xom))
---------
CVar(xom)がマークされコンパイルが出来ない
宣言は間違っていないと思っているのですが?
なにが悪いのかがわからない
どなたか教えて下さい


魔界の仮面弁士  2004-07-16 00:07:28  No: 114823

CVarを使わずに指定してみては如何ですか?
OLE系のAPIでも無ければ、CVarを使う必要は殆ど無いかと。

> CVar(xom)がマークされコンパイルが出来ない
CVar関数は、Variant型に変換するための関数ですよね。
ユーザー定義型をVariant型に変換するためには、
パブリックオブジェクトモジュールで定義されている必要があります。

つまり、標準モジュールではなく、ActiveXプロジェクトを作成して、
InstancingプロパティをPrivate以外に設定したクラス内でユーザー定義型を
宣言するか、もしくは、タイプライブラリで構造体を定義しない限り、
Variant型には変換できない、ということかと。


MB初心者  2004-07-16 02:06:01  No: 114824

魔界の仮面弁士さん  返事ありがとうございます
まず、CVarを使わずにすると、コンパイルはOKでしたが
『DLLが正しく呼び出せません』となり、実行時エラーが発生

次に、ActiveXプロジェクトを作成して、と思ったのですが
(たぶんDLLを作成すればよいのかな?)
前記のソースコードを置き換えるだけなのでしょうが、
知識・経験不足ゆえにどうすればよいのか、見当が付かず
迷子状態に至っています


魔界の仮面弁士  2004-07-16 02:55:07  No: 114825

> まず、CVarを使わずにすると、コンパイルはOKでしたが
> 『DLLが正しく呼び出せません』となり、実行時エラーが発生

XDWAPI.DLL という物は知らないのですが(DocuWorks API、という物ですか?)、
そのエラーが出る原因としては、

(1) DLL側が、VBから呼び出せるように設計されていない。
(2) Declare宣言が間違っている。

のいずれかだと思われます。

(1)については、「stdcall 呼び出し規則に従っているDLL」以外は
利用できません。それ以外のDLLだと、(開発環境からの呼び出し時に)
「DLLが正しく呼び出せません」というエラーになります。

(2)については、引数の数・引数のデータ型・戻り値の方・ByVal/ByRefなどが
間違っていた場合に発生します。

> 次に、ActiveXプロジェクトを作成して、と思ったのですが
引数が「Variant」で受けるようになっているならまだしも、
構造体として受け取る仕様であるなら、ActiveX化する必要は
おそらく無いかと思われます。


MB初心者  2004-07-16 04:30:42  No: 114826

魔界の仮面弁士さん  返事 本当にありがとうございます
>XDWAPI.DLL という物は知らないのですが(DocuWorks API、という物ですか?)
鋭い!まさにその通りです。
原因は多分(2)のように思われます
[解決]ではないのですが、
Cで考えて見ます
とりあえず、クローズします
魔界の仮面弁士さん  改めて御礼申し上げます。


魔界の仮面弁士  2004-07-16 09:52:24  No: 114827

とりあえず、開発キットという物をダウンロードしてみたところ…

  typedef struct tag_XDW_OPEN_MODE {
    int nSize;
    int nOption;
  } XDW_OPEN_MODE;

 int XDWAPI XDW_OpenDocumentHandle(
    const char* lpszFilePath,
    XDW_DOCUMENT_HANDLE* pHandle,
    XDW_OPEN_MODE* pOpenMode);

のような仕様になっているようですね。

という事は、
  Public Type XDW_OPEN_MODE
    nSize   As Long
    nOption As Long
  End Type
  Public Declare Function XDW_OpenDocumentHandle Lib "XDWAPI.DLL" _
     (ByVal FPath As String, _
      ByVal pHandle As OLE_HANDLE, _
      ByVal sMODE As XDW_OPEN_MODE) As Long
で如何でしょう。環境が無いので、こちらでは確認できませんけど。

# 元質問の宣言では、第1/第2引数が規定の型(通常はVariant)に
# なっていたので、少し置き変えてみました。


MB初心者  2004-07-16 23:13:50  No: 114828

魔界の仮面弁士さん  
開発キットまでDLして検証していただきまして
本当にありがとうございます。

参考にしてみます


魔界の仮面弁士  2004-07-17 05:35:20  No: 114829

すみません、訂正です。第2引数の宣言は、
『XDW_DOCUMENT_HANDLE pHandle』ではなく、
『XDW_DOCUMENT_HANDLE* pHandle』でしたので、
ByRefにする必要があると思います。

  Public Declare Function XDW_OpenDocumentHandle Lib "XDWAPI.DLL" _
     (ByVal FPath As String, _
      ByRef pHandle As Long, _
      ByVal sMODE As XDW_OPEN_MODE) As Long


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加