- PR -

C言語からVB.netで作成した.dllを呼出しクラスを利用する方法

投稿者投稿内容
ナチ
会議室デビュー日: 2006/10/25
投稿数: 5
投稿日時: 2006-10-25 10:32
開発初心者なのですが、ご存知の方がおられましたら教えてください。

上司より『C言語からVB.netで作成した.dllを呼出しクラスを利用する方法』
を調査しろと言われ途方に暮れています。

そもそも手続き型言語のCから、オブジェクト指向型のVB.NETを呼出すことは
可能なのでしょうか?

よろしくお願いします。
Blue
大ベテラン
会議室デビュー日: 2005/09/12
投稿数: 230
お住まい・勤務地: 知っている人は知っている
投稿日時: 2006-10-25 10:47
Windows環境(というかDLL自体がWindows環境なんだけど)であれば出来るんじゃないかなぁと。
(ただし、相当険しい道のりになりそうだけど。。。)

参考
CからC#を呼ぶ方法
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?forum=7&topic=26471


追記

COMを前提に考えていくのであれば、
COM研究室
http://www5.plala.or.jp/atata/com/
を参考にするとよいでしょう。

[ メッセージ編集済み 編集者: Blue 編集日時 2006-10-25 11:12 ]
ナチ
会議室デビュー日: 2006/10/25
投稿数: 5
投稿日時: 2006-10-25 11:24
大変申し訳ございません。

サンプルのコードなどがありましたら、
いただけませんでしょうか。。

よろしくお願い致します。



[ メッセージ編集済み 編集者: ナチ 編集日時 2006-10-25 19:17 ]
加納正和
ぬし
会議室デビュー日: 2004/01/28
投稿数: 332
お住まい・勤務地: 首都圏
投稿日時: 2006-10-26 00:07
引用:

ナチさんの書き込み (2006-10-25 10:32) より:

上司より『C言語からVB.netで作成した.dllを呼出しクラスを利用する方法』

そもそも手続き型言語のCから、オブジェクト指向型のVB.NETを呼出すことは




#その上司は調査の仕方は教えないのだろうか。。。

「最近」はC言語そのものが存在しません。最低でC++言語です。
まぁMinGWとか、gccとかaccなら別でしょうけど。

ほんとに無いんですって。VS .NET 2003 でさえ売ってるの?って感じですし。

ということで皆がいう「C言語」と上記の「C言語」は違ってる可能性があります。
ちなみに「上司」がいう「C言語」はVisual Studio 6.0 SP5ぐらいではないかと。
勝手に想像します。
#だから分からないんだろう、と。
#ちなみに、SP 6ってないよね?

なので、先に「何の」「C言語」かを聞いたほうがいいかも。最新のやつだと
やたらと簡単です。#usingで終わってしまう。。。そうするとふつーに書くと
IDEが指示するのですよ。この関数が使えるって。楽になったもんです。
Blue
大ベテラン
会議室デビュー日: 2005/09/12
投稿数: 230
お住まい・勤務地: 知っている人は知っている
投稿日時: 2006-10-26 00:20
返信内容を全く別の内容に編集されると、未読状態にならないので分かりづらいです。
(実際レスがついて、初めて編集されていることに気付いた。)

サンプルというか、「CからC#を呼ぶ方法 」のスレの CLSIDFromProgID を使うコードが主になります。
ただし、IDispatchをクラスとしてメソッドを呼び出しているのでそこを
関数テーブルから関数ポインタを使って自分自身を渡すように変更します。
具体的には
コード:
pDisp->Release();



コード:
pDisp->lpVtbl->Release(pDisp);


みたいな感じで。

それと、CoCreateInstance等の引数の型が若干変わっているので注意が必要です。
MicrosoftのサポートオンラインにOLEオートメーションの例がありますのである程度参考
にはなるでしょう。

[HOWTO] C++ アプリケーションではなく C アプリケーションから OLE オートメーションを使用する方法
http://support.microsoft.com/default.aspx?scid=kb%3Bja%3B181473

更に参考
[HOWTO] Visual C++ を使用してオートメーションで文書プロパティにアクセスする方法
http://support.microsoft.com/kb/238393/ja

上はExcelを、下はWordを対象にしたコードになっています。

[ メッセージ編集済み 編集者: Blue 編集日時 2006-10-26 00:23 ]
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2006-10-26 08:32
引用:

加納正和さんの書き込み (2006-10-26 00:07) より:
#ちなみに、SP 6ってないよね?


http://www.microsoft.com/japan/msdn/vstudio/downloads/sp/vs6sp6.aspx
Blue
大ベテラン
会議室デビュー日: 2005/09/12
投稿数: 230
お住まい・勤務地: 知っている人は知っている
投稿日時: 2006-11-09 11:27
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=34765&forum=7&4
のような無駄なことを考えてしまっているようなので(というかあちらでは私のコメントは無視されているようですが)、
[HOWTO]を参考にしたサンプルです。

まず、「登録されているVB.NETのID」を適切な文字列にして、
メッセージボックスが表示されずに終了すれば第一ステップはクリアです。
メッセージボックスが表示された場合、VB.NETでつくったDLLがCOMとして登録されていないということになります。

コード:
#include <windows.h>


HRESULT test( void )
{
HRESULT hr = S_OK;
CLSID clsid;
IDispatch* pDispatch = NULL;

hr = CLSIDFromProgID( L"登録されているVB.NETのID", &clsid );
if ( FAILED( hr ) ) return hr;

hr = CoCreateInstance( &clsid, NULL, CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER, &IID_IDispatch, ( void** )&pDispatch );

if ( FAILED( hr ) ) return hr;
pDispatch->lpVtbl->Release( pDispatch );

return hr;
}

int main( void )
{
HRESULT hr;
hr = CoInitialize( NULL );
if ( SUCCEEDED( hr ) )
{
hr = test();
if ( FAILED( hr ) )
{
/* エラー */
MessageBox( NULL, TEXT( "エラーです。" ), NULL, MB_OK );
}
CoUninitialize();
}
return 0;
}



[ メッセージ編集済み 編集者: Blue 編集日時 2006-11-10 00:54 ]
ナチ
会議室デビュー日: 2006/10/25
投稿数: 5
投稿日時: 2006-11-09 11:38
引用:

Blueさんの書き込み (2006-11-09 11:27) より:
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=34765&forum=7&4
のような無駄なことを考えてしまっているようなので(というかあちらでは私のコメントは無視されているようですが)、
[HOWTO]を参考にしたサンプルです。

まず、「登録されているVB.NETのID」を適切な文字列にして、
メッセージボックスが表示されずに終了すれば第一ステップはクリアです。
メッセージボックスが表示された場合、VB.NETでつくったDLLがCOMとして登録されていないということになります。

コード:
#include <windows.h>

HRESULT test( void )
{
    HRESULT hr = S_OK;
    CLSID clsid;
    IDispatch* pDispatch = NULL;

    hr = CLSIDFromProgID( L"登録されているVB.NETのID", &clsid );
    if ( FAILED( hr ) ) return hr;

    hr = CoCreateInstance( &clsid, NULL, CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER, &IID_IDispatch, ( void** )&pDispatch );

    if ( FAILED( hr ) ) return hr;
    hr = pDispatch->lpVtbl->Release( pDispatch );

    return hr;
}

int main( void )
{
    HRESULT hr;
    hr = CoInitialize( NULL );
    if ( SUCCEEDED( hr ) )
    {
        hr = test();
        if ( FAILED( hr ) )
        {
            /* エラー */
            MessageBox( NULL, TEXT( "エラーです。" ), MB_OK );
        }
        CoUninitialize();
    }
    return 0;
}






申し訳ございません。大変失礼致しました。
サンプル提供ありがとうございます。

こちらで試してみたいと思います。

スキルアップ/キャリアアップ(JOB@IT)